2015-06-24 2 views
0

Я вызываю асинхронный веб-api из веб-приложения ASP.NET ASP.NET из синхронного метода. Я получаю ошибку. произошла одна или несколько ошибок. При отправке запроса произошла ошибка. Подключенное соединение было закрыто: произошла непредвиденная ошибка при приеме. Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.Вызов асинхронного метода web api в синхронном методе trwing error

Если я вызываю одно и то же асинхронное веб-приложение api из приложения форм Windows, используя асинхронный метод, веб-api возвращает идеальное значение. Я должен использовать синхронный метод в веб-приложении, и, следовательно, код, который успешно протестирован в приложении Windows, не может использоваться в веб-приложении. Ниже приведена часть кода.

private string SECURE_API_Async(string WebApiURL, HttpContent httpContent, string[] apiNames, HTTP httpMethod, DictionaryEntry[] apiValues) 
    { 
     try 
     { 
      using (httpContent) 
      { 

       Last_HTTPRequestContent = httpContent == null ? "null" : httpContent.ReadAsStringAsync().Result; 
       HttpClient httpClient = new HttpClient(httpClientHandler); 
       httpClient.BaseAddress = new Uri(WebApiURL); 

       if (SessionTokenID != null) 
       { 
        httpClient.DefaultRequestHeaders.Add("SessionTokenID", SessionTokenID); 
       } 

       httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml")); 
       string target_URI = "api"; 

       foreach (string apiName in apiNames) 
       { 
        target_URI = string.Format("{0}/{1}", 
         target_URI, 
         apiName); 
       } 

       string target_URI_parameters = string.Empty; 

       if (apiValues != null) 
       { 
        target_URI_parameters = CreateParameterString(apiValues); 
       } 
       target_URI = (target_URI_parameters == string.Empty) ? target_URI : string.Format("{0}?{1}", target_URI, target_URI_parameters); 

       _lastURL = httpClient.BaseAddress.ToString() + target_URI; 
       Last_HTTPstatus = 0; 
       Last_ReasonPhrase = string.Empty; 
       Last_HTTPResponse = null; 
       Last_HTTPResponseString = string.Empty; 

       HttpResponseMessage response = null; 

       try 
       { 
        switch (httpMethod) 
        { 
         case HTTP.PUT: 
          { 
           response = httpClient.PutAsync(target_URI, httpContent).Result; 
           break; 
          } 

Я получаю сообщение об ошибке при вызове метода PutAsync.

Теперь, если я изменю метод

private **async** **Task<string>** SECURE_API_Async(string WebApiURL,  HttpContent httpContent, string[] apiNames, HTTP httpMethod, DictionaryEntry[] apiValues) 

и вызова API для

response = **await** httpClient.PutAsync(target_URI, httpContent); 

я получаю правильный ответ. То, что я узнал после того, как поиск в сети одновременно

response = **await** httpClient.PutAsync(target_URI, httpContent); 

(когда вызывающий метод имеет асинхронное значение ключевого слова вызова метода является aynchronous) и

response = httpClient.PutAsync(target_URI, httpContent).**Result**; 

(когда метод не имеет ключевого значение асинхронного метод вызова является синхронным)

Должно возвращать правильное ответное сообщение. Но мой синхронный метод вызывает базовую ошибку подключения. Может ли кто-нибудь помочь? Спасибо.

ответ

0

У меня были неправильные верительные грамоты. Таким образом, я получал ошибку. Существующее соединение было принудительно закрыто удаленным хостом. Странная ошибка. Одна из головных болей, если вы работаете в технологии MS. Они просто не выбрасывают надлежащую ошибку. Правильная ошибка должна быть неправильной.

Но вы можете назвать асинхронный метод, если используете результат , например.

HttpResponseMessage ответ = httpClient.PutAsync (target_URI, httpContent) .Result; // Синхронный вызов от синхронного метода

И

HttpResponseMessage ответ = ждут httpClient.PutAsync (target_URI, httpContent); // Синхронный вызов из метода ASynchronous, который имеет префикс async с префиксом

дает тот же результат.

Смежные вопросы