#c# #asp.net-mvc #httpwebrequest #httpwebresponse
#c# #asp.net-mvc #httpwebrequest #httpwebresponse
Вопрос:
У меня есть настольное приложение, которое вызывает asp.net действие контроллера mcv и получение ответа. Большую часть времени он работает нормально, но иногда настольное приложение получает исключение «Не удалось разрешить удаленное имя: url»
Вот функция в настольном приложении, которая выполняет запрос http-post:
> private bool postRequest(string uri, string json, out string jsonResult)
> {
> try
> {
> if (CheckForInternetConnection())
> {
> var httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
> httpWebRequest.ContentType = "application/json";
> httpWebRequest.Method = "POST";
> httpWebRequest.Timeout = 300000;
> //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 |
> SecurityProtocolType.Tls;
> using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
> {
> //string json = JsonConvert.SerializeObject();
> //string json = new JavaScriptSerializer().Serialize(new
> //{
> // Username = "myusername",
> // Password = "pass"
> //});
> streamWriter.Write(json);
> streamWriter.Flush();
> streamWriter.Close();
> }
>
> var res = httpWebRequest.GetResponse();
> var httpResponse = (HttpWebResponse)res;
> //message = httpResponse.ToString();
> //jsonResult = httpResponse.StatusCode.ToString();
> //message = httpResponse.StatusDescription;
> //return true;
> using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
> {
> var result = streamReader.ReadToEnd();
> jsonResult = result.ToString();
> return true;
> }
> }
> else
> {
> throw new Exception("Problem in internet connection.");
> }
> }
> catch (Exception ex)
> {
> //using (StreamWriter w = File.AppendText(@"C:UsersShubhamDesktoplog.txt"))
> //{
> // Log(ex.Message, w);
> //}
> throw ex;
> }
>
> }
ниже приведено одно из действий в asp.net mcv, которые вызываются настольным приложением:
> [HttpPost]
> public ActionResult getSku(EmployeeDetails emp)
> {
> try
> {
> if (helper.getSku(emp, out SkuDetails skuDt))
> {
> JsonCreateResult json = new JsonCreateResult()
> {
> ex = null,
> id = skuDt.SemId,
> Message = JsonConvert.SerializeObject(skuDt),
> statusCode = HttpStatusCode.Found
> };
> return Json(json);
> }
> else
> {
> var key = dictionary.GetOrAdd(emp.SubscriberId emp.EmployeeRole, new object());
> bool flag;
> SkuDetails skuDetails;
> lock (key)
> {
> flag = helper.getSkuFromSm(emp, out skuDetails);
> }
> if (flag)
> {
> JsonCreateResult json = new JsonCreateResult()
> {
> ex = null,
> id = skuDetails.SemId,
> Message = JsonConvert.SerializeObject(skuDetails),
> statusCode = HttpStatusCode.Found
> };
> return Json(json);
> }
> else
> {
> JsonCreateResult json = new JsonCreateResult()
> {
> ex = null,
> id = string.Empty,
> Message = string.Empty,
> statusCode = HttpStatusCode.NotFound
> };
> return Json(json, JsonRequestBehavior.AllowGet);
> }
> }
> }
> catch (Exception ex)
> {
> helper.getErrorInBuild(emp.SubscriberId, "getSku", ex.Message, emp.EmployeeId emp.EmployeeRole, string.Empty);
> JsonCreateResult json = new JsonCreateResult()
> {
> ex = ex,
> id = string.Empty,
> Message = string.Empty,
> statusCode = HttpStatusCode.InternalServerError
> };
> return Json(json, JsonRequestBehavior.AllowGet);
> }
> }
Я использую lock () и статический ConcurrentDictionary в asp.net контроллер mvc, как вы можете видеть в вышеупомянутом действии. Я не знаю, является ли это причиной проблемы, как если бы статическая переменная хранилась поверх данных, а затем ограничивалась.
Это настольное приложение запущено на нескольких рабочих столах, и каждый генерирует запрос параллельно.
Пожалуйста, помогите мне, если кто-нибудь знает об этом исключении и решении для него
Исключение, которое я получил, введите описание изображения здесь
Комментарии:
1. Если вы используете неправильный URL в запросе POST, вы получите сообщение об ошибке. Что касается блокировок и ConcurrentDictionary, да, блокировки не нужны. Эта блокировка вообще ничего не сделает, поскольку она блокируется вокруг локальной переменной.
2. Если это действительно ошибка, где-то ваш URL-адрес «url» «http: // …» если имя не поддается разрешению, иногда существуют другие причины, такие как компании с прокси-серверами, вашему компьютеру не нужно знать, как искать имя сервера, это делает только прокси-сервер
3. Я предполагаю, что вам не хватает http / https в вашей строке URL. Поскольку вы пытаетесь установить связь по протоколу http, вам необходимо указать это.
4. Проблема не в http / htps, как я уже упоминал об этом в url. Как я уже говорил выше, настольное приложение работает большую часть времени. Если проблема связана с http / https, то это вообще не должно работать
5. Ваше веб-приложение работает постоянно? Я имею в виду, что если он запущен в IIS Express, то есть вероятность, что сервер Express находится в спящем режиме, если к нему не обращаются в течение некоторого времени