热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

调用HttpClient错误。底层连接被关闭-ErrorcallingHttpClient.GetAsync:Theunderlyingconnectionwasclosed

Ihaveanasp.netMVCwebsitewhichisconsumingarestapitoreceiveitsdata.Imusingasynchro

I have an asp.net MVC website which is consuming a rest api to receive it's data. I'm using asynchronous tasks to perform the requests as there can be many on each page. After a while of uptime the website has been throwing the following error when trying to receive data.

我有一个asp.net MVC网站,它使用一个rest api来接收它的数据。我使用异步任务来执行请求,因为每个页面上可能有很多请求。一段时间后,网站在尝试接收数据时抛出了以下错误。

The underlying connection was closed: An unexpected error occurred on a send.

底层连接被关闭:发送时发生意外错误。

I read that this could be due to the maxconnection settings on the web.config but increasing this doesn't seem to make much difference.

我读到这可能是因为web上的maxconnection设置。配置,但是增加这个似乎没有多大区别。

I'm also using caching to reduce the load on the api. The task is cached so the result can be used later.

我还使用缓存来减少api的负载。缓存任务,以便稍后使用结果。

The only way I've found to fix this is by recycling the application pool. Any help would be appreciated.

我找到的唯一修复方法是回收应用程序池。如有任何帮助,我们将不胜感激。

/* Code from page_load */

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

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


/* Code from data access later */

public class ApiClient : HttpClient
{
  public static Task GetAsync(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)cachedTask;
      }

    }

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

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

    return task;
  }

  public static async Task GetAsyncData(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());
    }
  }
}

2 个解决方案

#1


3  

This is wrong,

这是错误的,

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

缓存任务,以便稍后使用结果。

You are supposed to cache result, not the task. At end of first execution, your HttpClient is closed and when you try to retrieve cached task, it will not work.

您应该缓存结果,而不是任务。在第一次执行结束时,HttpClient关闭,当您试图检索缓存的任务时,它将无法工作。

public class ApiClient : HttpClient
{
  public static async Task GetAsync(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(operation, query);

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

    return result;
  }

  public static async Task GetAsyncData(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());
    }
  }
}

#2


0  

Akash could be right. But it seems more or less connection issue with application pool. Set the connection limit 0 to make it unlimited at application pool. Have a finally block in you code, and

阿卡什可能是正确的。但它似乎或多或少地与应用程序池有关。将连接限制设置为0,使其在应用程序池中不受限制。在你的代码中有一个最终块

gc.collect();

garbage collection method to be called to remove unused connections to make space for other connection.

调用垃圾收集方法,以删除未使用的连接,为其他连接腾出空间。


推荐阅读
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 本文介绍如何通过Java代码调用阿里云短信服务API来实现短信验证码的发送功能,包括必要的依赖添加和关键代码示例。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • 探讨在iOS客户端向服务器上传数据流的过程中,若服务器因权限校验失败而未接收流直接响应时,如何有效避免客户端出现超时的问题。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 本文探讨了Hibernate库与Hibernate JPA库之间的主要区别,以及它们在实际应用中的不同之处。同时,文章还详细解释了使用org.hibernate.SessionFactory与JPA javax.persistence.EntityManager实现的具体差异。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • Irish budget airline Ryanair announced plans to significantly increase its route network from Frankfurt Airport, marking a direct challenge to Lufthansa, Germany's leading carrier. ... [详细]
author-avatar
justmoon999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有