【发布时间】:2010-07-26 19:35:07
【问题描述】:
我有一个 ASP.NET Web 窗体应用程序,它在内部对 Web 服务进行许多 SOAP 和 REST 调用。 SOAP 调用是使用 Microsoft 自己的“包装”代码进行的。 REST 调用是从一个简单的 REST 客户端发出的。此客户端使用 Using 块来处理任何资源。
应用程序可以正常运行几个小时,但随后挂断。该站点将不再能够提供 asp.net 页面。我通过在其上放置一个 hello.htm 文件来测试该站点……它运行良好。所以肯定是ASP.NET引擎空间的问题。
感觉好像它已经用完了来自池的 webrequests。我可能会走得很远。我可以尝试什么?我应该看什么?重现问题需要几个小时。 在 IIS 上重新启动站点可以解决问题,但当然不是我们可以接受的真正解决方案。
错误开始和堆栈跟踪:
“/”应用程序中的服务器错误。
操作已超时 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.Net.WebException:操作已超时
来源错误: 在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。
堆栈跟踪: [WebException:操作已超时] System.Net.HttpWebRequest.GetRequestStream() +5322142 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] 参数) +103
更新和更多信息
自制的 REST 调用和 SOAP 都是同步完成的。
它们的寿命不长,大约需要 1 秒。
Web 服务托管在同一数据中心的 Tomcat 服务器(不同的机器)上。
.NET 应用程序调用 Tomcat 服务器上的 SOAP 和 REST 服务。
在挂起状态停留大约一个小时后,该应用程序以某种方式自行修复。想法? 如何监控 .NET 线程池? DefaultConnectionLimit 是否会影响自发起的出站连接?
分辨率
请参阅其他 cmets 的答案和...
1) 关闭您自己开发的 REST 代码中的所有流和响应/请求 (oops)
2) System.Net.ServicePointManager.DefaultConnectionLimit = 96;
// 默认值 = 12 次核心数
System.Net.ServicePointManager.MaxServicePointIdleTime= 3000;
// 默认值 = 100000(100 秒)
通过修复任何泄漏的代码并更快地使 IdleTime 超时,现在一切似乎都可以正常工作了
【问题讨论】:
-
您调用的外部 SOAP 服务是否有任何使用限制?跟踪它正在调用的服务,看看你是否可以重复点击它,就像你在实践中点击它一样多次。所有页面都调用相同的服务吗?是所有 SOAP 调用都失败还是只有这一次失败?
-
我可以使用 WinForms 客户端和另一个 ASP.NET Web 应用程序(相同的 IIS)从同一个框中点击它。此 IIS 站点超时的所有调用 REST 或 SOAP。应用程序日志将其列为 WebException Timeout
-
如何查看这个应用程序占用了多少内存?我对导航 IIS 7 或 win2008 还不太熟悉
-
有谁知道 IIS 7 上的 .NET 4.0 是否会比 IIS 7 上的 .NET 3.5 更好地处理大量 WebRequest 的创建和销毁?
标签: .net asp.net web-services httpwebrequest