2010-07-26 62 views
1

我有一个ASP.NET Web窗体应用程序,它在内部对Web服务进行了许多SOAP和REST调用。 SOAP调用使用微软自己的“包装”代码。 REST调用来自一个简单的REST客户端。该客户端使用Using块来处理任何资源。WebRequest和资源 - ASP.NET超时

该应用程序运行良好几个小时,但然后挂断。该网站将不再能够提供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(字符串方法名,对象[]参数) +103

UPDATE等详细信息
的自产自销的REST调用和SOAP都做同步。
他们并不长寿,他们需要约1秒。
Web服务托管在同一个数据中心内的Tomcat服务器(不同机器)上。
.NET应用程序在Tomcat服务器上调用SOAP和REST服务。

该应用程序以某种方式在大约停留一小时之后自行修复。思考? 如何监视.NET Threadpool? DefaultConnectionLimit会影响自发出站连接吗?

解决方案 看到答案补充意见和...... 1)关闭所有流和反应/从自产自销的REST代码请求(哎呀)
2)System.Net.ServicePointManager.DefaultConnectionLimit = 96;
//默认值= 12次内核数量
System.Net.ServicePointManager。MaxServicePointIdleTime = 3000;
//默认= 100000(100秒),
通过固定的任何渗漏代码和超时的空闲时间更快的一切似乎

+0

您对外部SOAP服务有任何使用限制吗?追踪它所调用的服务,看看您是否可以在练习中多次击中它。所有页面都会调用同一个服务吗?所有的SOAP调用都会失败还是只有这个? – 2010-07-26 19:52:30

+0

我可以使用WinForms客户端和另一个ASP.NET Web应用程序(同一个IIS)从同一个盒子中找到它。所有从此IIS站点调用REST或SOAP超时。应用程序日志将其列为WebException超时 – BuddyJoe 2010-07-26 20:02:09

+0

如何检查此应用程序占用了多少内存?我还不熟悉导航IIS 7或win2008 – BuddyJoe 2010-07-26 20:05:02

回答

3

1)您是否使用异步WebRequests好工作呢? 2)您的Web服务调用是否已经过很长时间(意思是需要很长时间才能完成?) 3)Web服务在哪里托管?它在同一台机器上吗? 4)REST服务托管在哪里?与asp.net应用程序相同的机器还是不同?

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

无论如何,您的应用程序正在线程池线程上调用。在此线程上,您正在发出HTTPWebRequest(HWR)。如果这个请求是同步的,它不应该使用任何额外的线程。但是,如果它是异步的,它将从池中取出另一个线程来完成。

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

到目前为止,我假设代码中没有逻辑错误,并且正在正确处置HttpWebResponse对象。

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

如果您的后端Web服务调用属于同一台机器,并且您尚未将ServicePointManager.DefaultConnectionLimit增加到您的方案的合理值,也可能发生这种情况。例如,如果您的asp.net应用程序预计会有200个同时发生的请求,您应该设置DefaultConnectionLimit = 200 +一些合理的缓冲区。连接池中缺乏连接也会导致这种情况。

解决方案:

我先起来DefaultConnectionLimit。如果这不能解决它,那么你将需要监视ASP.NET性能计数器,并查看.Net线程池是否正在耗尽,这可能会导致web请求失败。

+0

感谢您的帮助。请参阅原始问题中的UPDATE。 +1 – BuddyJoe 2010-07-27 13:50:10

+1

是的,DefaultConnectionLimit会影响从您的应用程序启动的出站连接。作为第一个测试,我会尝试增加,看看它是否能解决您的问题。 用于监测线程数量,您可以看到性能计数器 。NET CLR锁和线程/当前物理线程的数量 作为线程池中#个线程的代理。 您还可以跟踪asp.net性能计数器跟踪请求排队/请求执行等 – feroze 2010-07-28 20:30:17

+0

在这一个被称为微软的支持和这两个设置是关键 - http://stackoverflow.com/questions/3363183 – BuddyJoe 2010-07-30 13:09:25