WCF客户端挂起服务中断

问题描述:

我有一个相当直接的WCF服务,为一堆智能客户端执行单向文件同步。我注意到,在通话过程中出现网络或服务中断时,客户端将停止与服务器通信,直到整个应用程序重新启动。WCF客户端挂起服务中断

该服务使用BasicHttpBinding运行,并使用IIS6(.svc页面),使用transferMode="Streamed"messageEncoding="Mtom"。该服务被配置为使用默认的InstanceContextMode(我认为它是Per Call?)和ConcurrencyMode = Single。它使用默认的限制行为,但我处于没有其他人正在击中的独立测试环境中。

客户端是Windows服务。我使用这个ServiceProxyHelper确保连接是Close()'d或Abort()'d当Dispose()'d,虽然没有会话,所以我不认为这甚至很重要。发生错误时,客户端对象被丢弃,然后超出范围。在检测到异常之后,服务会等待一段时间,然后创建一个新的客户端对象并再次尝试。所以它应该从失败中恢复,但由于某种原因,后续对该服务的所有调用都会失败。

我可以通过启动客户端来可靠地重现这一点,允许它传输几个文件,然后重新设置服务器。首先,客户端通常显示“服务太忙”错误(映射到在应用程序重新启动期间获得的IIS 503错误)。之后,所有后续的服务呼叫超时。据我所知,这些呼叫甚至没有被客户尝试。我启用了跟踪,看到的是:超时错误,后面跟着一个“无法通过HTTP发送请求消息”的警告,接着是另一个超时错误。

疯狂的事情是,当我配置客户端使用Fiddler(端口8888)作为app.config中的代理时,一切都按需要工作。所以不知何故Fiddler作为代理正在关闭或终结某种WCF本身不存在的连接。

想法?

编辑2009-10-30 8:54 PM:将服务属性更改为:InstanceContextMode = Single和ConcurrencyMode = Multiple。没有不同。

那真是痛苦。它花了我一直,但最后我把注意力放在了运行代理与没有运行之间的差异上,并开始拨动<system.net>设置。事实证明,将此配置位添加到客户端可以修复问题:

<system.net> 
    <settings> 
     <servicePointManager expect100Continue="false" /> 
    </settings> 
    </system.net> 

有人可以解释发生了什么吗?为什么这个设置会导致WCF客户端在服务中断时无法挽回地挂起?

+0

在'WebRequest'中有关于100继续功能的已知错误。 http://regis.decamps.info/blog/2010/12/c-bug-in-webrequest/ – rds 2011-01-03 18:15:51

您确定这不是客户端问题。如果您的Windows服务正在从主服务器的单独线程上进行WCF调用,并且您在子线程上发生了未处理的异常......调用线程可能会或可能不会坐在那里并永远等待因为它正在等待为该线程返回。

这可以解释为什么服务内部有一个Exception,然后看起来服务不再打电话给服务......它被挂起。

在.NET 2.0 Windows Services中使用计时器产生进程时,曾经是一个巨大的问题。

+0

我认为这是一个客户端问题,但我不认为它是线程,虽然你说的正确的是,这些客户端是在不同的线程上产生的,而不是主要的。我正在使用BackgroundWorker而不是线程,并且在线程出错时挂钩到RunWorkerCompleted事件中以重新启动。我看到这个逻辑被执行,我看到工作人员再次启动并试图与服务进行通信。这些后续的呼叫失败了。 – roufamatic 2009-10-29 23:09:44