我有一个ASP.NET Web窗体应用程序,它在内部对Web服务进行许多SOAP和REST调用。 SOAP调用是使用Microsoft自己的“包装”代码进行的。 REST调用由简单的REST客户端完成。此客户端使用“使用块”处理任何资源。
该应用程序可以运行几个小时,但随后挂起。该网站将无法再提供asp.net页面。我通过在其上放置一个hello.htm文件来测试该网站...它服务很好。所以它绝对是ASP.NET引擎空间中的一个问题。
感觉它已经耗尽了池中的webrequests。我可能会离开。我该怎么办?我该怎么看?重新制作问题需要几个小时。 在IIS上重新启动站点可以解决问题,但cource并不是我们可以解决的问题。
错误开始和堆栈跟踪:
'/'应用程序中的服务器错误。
操作已超时 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.Net.WebException:操作已超时
来源错误: 在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
堆栈跟踪: [WebException:操作已超时] System.Net.HttpWebRequest.GetRequestStream()+5322142 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,Object [] parameters)+103
更新和更多信息
自行开发的REST调用和SOAP都是同步完成的
他们不是长寿,他们需要大约1秒
Web服务托管在同一数据中心的Tomcat服务器(不同的计算机)上
.NET应用程序在Tomcat服务器上调用SOAP和REST服务。
该应用程序在停留在这个悬挂状态大约一个小时后以某种方式自行修复。思考? 如何监控.NET Threadpool? DefaultConnectionLimit是否会影响自发起的出站连接?
解决
看到答案的其他评论和......
1)从您自己开发的REST代码(oops)中关闭所有流和响应/请求
2)System.Net.ServicePointManager.DefaultConnectionLimit = 96;
//默认= 12次核心数量
System.Net.ServicePointManager.MaxServicePointIdleTime = 3000;
//默认= 100000(100秒)
通过修复任何泄漏代码并更快地超时IdleTime,现在一切似乎都能正常工作
答案 0 :(得分:3)
1)您使用的是异步WebRequests吗? 2)您的Web服务调用是否存在很长时间(意味着它们需要很长时间才能完成?) 3)webservice在哪里托管?它在同一台机器上吗? 4)REST服务托管在哪里?与asp.net app相同或不同的机器?
当请求进入ASP.NEt服务器时,它在线程池线程上处理。我不确定这是完成端口线程还是线程池线程。
无论如何,您的应用程序正在线程池线程上调用。在此线程上,您正在进行出站HTTPWebRequest(HWR)。如果此请求是同步的,则不应采用任何额外的线程。但是,如果它是异步的,则需要从池中完成另一个线程。
现在,如果您所做的HWR回到同一台服务器,并且该请求需要在同一台服务器上完成另一个线程,那么您现在需要再增加一个线程。将此与Web服务相结合需要很长时间,并且每个请求都会占用至少2个(最多3个)线程。如果您向asp.net服务器发出大量请求,服务器可以快速达到最大线程池线程限制。
到目前为止,我假设您的代码中没有逻辑错误,并且您正在正确处理您的HttpWebResponse对象。
因此,当没有线程完成工作时,您的HttpWebRequest可以抛出超时异常。
如果您的后端Web服务调用到同一台计算机,并且您没有将ServicePointManager.DefaultConnectionLimit增加到您的方案的合理值,也可能发生这种情况。例如,如果您的asp.net应用程序预计会同时发出200个请求,则应将DefaultConnectionLimit = 200 +设置为合理的缓冲区。连接池中缺少连接也可能导致这种情况。
解决方案:
我首先要使用DefaultConnectionLimit。如果这没有解决它,那么你需要监视ASP.NET性能计数器,看看.Net线程池是否正在耗尽,这可能导致webrequests失败。