2009-08-06 77 views
0

我的应用程序有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有关无法处理低级别例外情况。我会随时向您通报我调查的进展情况。

回答

1

要解决这个问题,我们将establishSecurityContext设置为False。

0

我还没有遇到过这个问题,但会建议在服务和/或客户端应用程序的配置中启用WCF服务的跟踪/消息日志记录(如果您有控制权的话)。过去几天我已经完成了我需要排除故障的服务。

的MSDN链接here是一个很好的起点。

也看到表中this后的跟踪细节,您可以配置的不同级别。有几个级别可以从例外记录到完整的消息细节。在app.config文件中设置它非常快。

要解析日志文件输出,请使用Windows SDK附带的SvcTraceViewer.exe,如果安装了它,应该位于以下文件夹中:C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0 \ Bin

1

听起来就像你正在用尽连接。

默认情况下WCF有超时,因此持有开放10分钟的连接。

当您回收应用程序池时,所有连接都关闭,因此重新开始工作。

要修复它检查你的代码,以确保您有密切联系/处置代理。

+0

客户端关闭连接(我们控制客户端应用程序),但这仍然是一个好点。例如,如果客户端应用程序崩溃(或被杀害),它可能没有机会关闭代理。但是在这种情况下,如果服务器达到连接的最大数量,服务器不会抛出错误? – Sylvain 2009-08-07 12:37:33

+0

我会尝试降低服务器上的receiveTimeout。如果我开始超时,这将表明客户端关闭代理的方式存在问题。 – Sylvain 2009-08-07 12:51:39

+0

我降低了receiveTimeout。这并没有改变任何事情。我即将排除我没有连接的想法。我在受控环境中做了一个测试:当一个服务器用完连接时,客户端收到的错误是TimoutException,而不是CommunicationException,比如我在生产中得到的错误。所以我认为这是别的。 – Sylvain 2009-08-13 18:13:47