Asp.net

呼叫 HttpClient.GetAsync 時出錯:底層連接已關閉

  • May 27, 2015

我有一個 asp.net MVC 網站,它正在使用一個 rest api 來接收它的數據。我正在使用非同步任務來執行請求,因為每個頁面上可能有很多。經過一段時間的正常執行時間後,該網站在嘗試接收數據時拋出以下錯誤。

底層連接已關閉:發送時發生意外錯誤。

我讀到這可能是由於 web.config 上的 maxconnection 設置,但增加這似乎沒有太大區別。

我還使用記憶體來減少 api 的負載。該任務被記憶體,以便以後可以使用結果。

我發現解決此問題的唯一方法是回收應用程序池。任何幫助,將不勝感激。

/* Code from page_load */

var currenciesTask = ApiClient.GetAsync<CurrencyListWrapper>("currencies");
var blogArticleTask = ApiClient.GetAsync<BlogArticleListWrapper>("blog/articles", "limit=10");
var seoPageTask = ApiClient.GetAsync<SEOPageListWrapper>("seopages");

await Task.WhenAll(currenciesTask, blogArticleTask, seoPageTask);


/* Code from data access later */

public class ApiClient : HttpClient
{
 public static Task<T> GetAsync<T>(string operation, string query = null, bool cache = true)
 {
   // Check if task is in cache
   string cacheName = null;

   if (cache)
   {
     cacheName = String.Format("{0}_{1}_{2}", operation, query ?? String.Empty, App.GetLanguage());

     var cachedTask = HttpRuntime.Cache[cacheName];

     if (cachedTask != null)
     {
       return (Task<T>)cachedTask;
     }

   }

   // Get data task
   var task = GetAsyncData<T>(operation, query);

   // Add to cache if required
   if (task != null && cache)
   {
     App.AddToCache(cacheName, task);
   }

   return task;
 }

 public static async Task<T> GetAsyncData<T>(string operation, string query = null)
 {
   using (ApiClient client = new ApiClient())
   {
     string url;

     if (query != null)
     {
       url = String.Format("{0}?{1}", operation, query);
     }
     else
     {
       url = String.Format("{0}", operation);
     }

     var response = await client.GetAsync(url);

     return (await response.Content.ReadAsAsync<T>());
   }
 }
}

這是錯誤的,

該任務被記憶體,以便以後可以使用結果。

您應該記憶體結果,而不是任務。在第一次執行結束時,您HttpClient已關閉,當您嘗試檢索記憶體的任務時,它將不起作用。

public class ApiClient : HttpClient
{
 public static async Task<T> GetAsync<T>(string operation, string query = null, bool cache = true)
 {
   // Check if task is in cache
   string cacheName = null;

   if (cache)
   {
     cacheName = String.Format("{0}_{1}_{2}", operation, query ?? String.Empty, App.GetLanguage());

     T cachedResult = (T)HttpRuntime.Cache[cacheName];

     if (cachedResult!= null)
     {
       return Task.FromResult(cachedResult);
     }

   }

   // Get data task
   var result = await GetAsyncData<T>(operation, query);

   // Add to cache if required
   if (result != null && cache)
   {
     App.AddToCache(cacheName, result);
   }

   return result;
 }

 public static async Task<T> GetAsyncData<T>(string operation, string query = null)
 {
   using (ApiClient client = new ApiClient())
   {
     string url;

     if (query != null)
     {
       url = String.Format("{0}?{1}", operation, query);
     }
     else
     {
       url = String.Format("{0}", operation);
     }

     var response = await client.GetAsync(url);

     return (await response.Content.ReadAsAsync<T>());
   }
 }
}

引用自:https://stackoverflow.com/questions/30332677