代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

WebRequest和资源-ASP.NET超时

  •  1
  • BuddyJoe  · 技术社区  · 14 年前

    感觉好像池中的webrequests用完了。我可能走得太远了。我能试试什么?我应该看什么?把问题重新处理要花几个小时。 在IIS上重新启动站点可以解决这个问题,但of cource并不是一个我们可以接受的解决方案。

    开始错误和堆栈跟踪:
    “/”应用程序中存在服务器错误。

    描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误的详细信息以及错误在代码中的起源。

    异常详细信息:System.Net.WebException:操作已超时

    堆栈跟踪: [WebException:操作已超时] System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,Object[]参数)+103


    自制的REST调用和SOAP都是同步完成的。
    它们的寿命不长,大约需要1秒钟。
    Web服务托管在同一数据中心的Tomcat服务器(不同的机器)上。
    NET应用程序调用Tomcat服务器上的SOAP和REST服务。

    这个应用程序在这个挂起的状态下呆了大约一个小时后,不知怎么的修复了自己。思想? 如何监视.NET线程池?DefaultConnectionLimit是否影响自启动的出站连接?

    分辨率 1) 关闭来自您自己开发的REST代码(oops)的所有流和响应/请求
    2) System.Net.ServicePointManager.DefaultConnectionLimit=96;


    //默认值=100000(100秒)
    通过修复任何泄漏的代码并加快空闲时间,现在一切似乎都正常了

    1 回复  |  直到 14 年前
        1
  •  3
  •   feroze    14 年前

    1) 您使用的是异步WebRequests吗? 2) 您的web服务调用是否长期存在(意味着它们需要很长时间才能完成?) 4) REST服务在哪里托管?与asp.net应用程序的计算机相同还是不同?

    当请求进入ASP.NEt服务器时,它将在线程池线程上处理。我不确定这是一个完成端口线程还是一个线程池线程。

    无论如何,您的应用程序正在线程池线程上调用。在这个线程上,您正在发出一个出站HTTPWebRequest(HWR)。如果此请求是同步的,则不应占用任何额外线程。但是,如果它是异步的,则需要池中的另一个线程才能完成。

    现在,如果您所做的HWR返回到同一服务器,并且该请求需要同一服务器上的另一个线程来完成,那么您现在需要另外一个线程。再加上Webservice需要很长时间,每个请求至少占用2个(最多3个)线程。如果您向asp.net服务器发出大量请求,服务器会很快达到最大线程池线程限制。

    到目前为止,我假设您的代码中没有逻辑错误,并且您正确地处理了HttpWebResponse对象。

    因此,当没有线程来完成工作时,HttpWebRequest会引发超时异常。

    如果您的后端webservice调用是在同一台计算机上进行的,并且您没有将ServicePointManager.DefaultConnectionLimit增加到适合您的场景的合理值,也可能会发生这种情况。例如,如果您的asp.net应用程序预期同时遇到200个请求,则应设置DefaultConnectionLimit=200+一些合理的缓冲区。连接池中缺少连接也会导致此问题。

    解决方案:

    我会先设置默认连接限制。如果这不能解决问题,那么您需要监视ASP.NET性能计数器,并查看.NET线程池是否已耗尽,这可能导致webrequests失败。