我的应用程序有50个服务端点(如/mysite/myService.svc)。它在IIS中托管。间歇性地(每两天或三天一次)服务停止响应。它永远不会是挂起的同一个服务。当一项服务被挂起时,其他服务的一些工作正常,另一些服务也被挂起。WCF服务挂起和客户端收到ServiceModel.CommunicationException
所有客户端(从不同的计算机)收到此错误:
ServiceModel.CommunicationException
Message: An error occurred while receiving the HTTP response to
https://server/mysite/myservice1.svc.
This could be due to the service endpoint binding not using the HTTP
protocol. This could also be due to an HTTP request context being
aborted by the server (possibly due to the service shutting down).
See server logs for more details.
无异常由当客户端试图调用挂起该服务的服务器提高。我所拥有的只是客户端的错误。
我不得不手动回收应用程序池来解决问题。
你知道可能是什么原因吗?我该如何调查这个问题?当服务挂起时,我愿意将工作进程的内存转储取出,但我不知道在转储中搜索什么。
更新(2009年8月13日):我几乎排除了服务器用完连接的想法(请参阅Shiraz Bhaiji的回答中的评论)。我可能会有一个新的潜在客户:我将所有服务器端异常记录在日志文件中。所以理论上,当客户端发生这种情况时,服务器上不会产生异常;否则我会在我的日志中证明这一点。但是如果在服务器上发生了错误,但是在低级别发生异常未被路由到我的异常处理代码的情况呢?我已发布this question有关无法处理低级别例外情况。我会随时向您通报我调查的进展情况。
客户端关闭连接(我们控制客户端应用程序),但这仍然是一个好点。例如,如果客户端应用程序崩溃(或被杀害),它可能没有机会关闭代理。但是在这种情况下,如果服务器达到连接的最大数量,服务器不会抛出错误? – Sylvain 2009-08-07 12:37:33
我会尝试降低服务器上的receiveTimeout。如果我开始超时,这将表明客户端关闭代理的方式存在问题。 – Sylvain 2009-08-07 12:51:39
我降低了receiveTimeout。这并没有改变任何事情。我即将排除我没有连接的想法。我在受控环境中做了一个测试:当一个服务器用完连接时,客户端收到的错误是TimoutException,而不是CommunicationException,比如我在生产中得到的错误。所以我认为这是别的。 – Sylvain 2009-08-13 18:13:47