asp.net – 调用HttpClient.GetAsync时出错:基础连接已关闭
发布时间:2020-12-15 22:47:48 所属栏目:asp.Net 来源:网络整理
导读:我有一个asp.net MVC网站,它正在消耗一个休息的api来接收它的数据.我正在使用异步任务执行请求,因为每个页面上可能有很多.经过一段时间的正常运行时间,网站在尝试接收数据时一直抛出以下错误. 基础连接已关闭:发送时发生意外错误. 我读到这可能是由于web.co
我有一个asp.net MVC网站,它正在消耗一个休息的api来接收它的数据.我正在使用异步任务执行请求,因为每个页面上可能有很多.经过一段时间的正常运行时间,网站在尝试接收数据时一直抛出以下错误.
基础连接已关闭:发送时发生意外错误. 我读到这可能是由于web.config上的最大连接设置,但增加这似乎并没有太大的区别. 我也使用缓存来减少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}",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,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,operation); } var response = await client.GetAsync(url); return (await response.Content.ReadAsAsync<T>()); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 实体框架不会显示存储过程
- asp.net-mvc – 使用Web Api验证.NET MVC应用程序
- asp.net-mvc – ActionLink无法在“if”块内渲染
- asp.net-mvc – @Model和@model之间的区别
- asp.net-membership – 如何使用Microsoft.Web.WebPages.OA
- 如何在ASP.NET中为Craigslist批量发布创建根RDF / XML元素
- asp.net-mvc-2 – MVC2 – > MVC3升级
- asp.net – 在编辑模式下未选择的Html.DropDownListFor值
- asp.net-mvc-3 – MVC 3 WebGrid – 可以进行内联编辑吗?
- asp.net – 敏捷,Scrum和CMMI TFS流程模板有什么区别?