asp.net - 调用 HttpClient.GetAsync : The underlying connection was closed 时出错

标签 asp.net asynchronous asp.net-web-api

我有一个 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>());
    }
  }
}

最佳答案

这是错误的,

The task is cached so the result can be used later.



您应该缓存结果,而不是任务。在第一次执行结束时,您的 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>());
    }
  }
}

关于asp.net - 调用 HttpClient.GetAsync : The underlying connection was closed 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30332677/

相关文章:

asp.net - 在 ASP.NET MVC 中构建多个半静态页面

c# - 我怎样才能异步调用这个网络服务?

带有线程/处理的 Django 长时间运行的异步任务

c# - 如何在启动时启动服务 (`IServiceCollection` )

asp.net-web-api - 我收到错误 401 : unauthorized when accessing my web API

C# 获取 SelectedDate.Day 字符串值并将其绑定(bind)到 gridview

asp.net - 使用 Cookie 获取 Web session 状态 - 有哪些陷阱?

javascript - Cookie 在 HttpResponseMessage 中可见,但在 Javascript 中不可见

asp.net - C#/OWIN/ASP.NET : can I *manually* generate and get a valid bearer token string in my API code?

javascript - 如何从异步调用返回响应?