Asp.net
呼叫 HttpClient.GetAsync 時出錯:底層連接已關閉
我有一個 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>()); } } }