【发布时间】:2009-10-29 22:31:20
【问题描述】:
我有一个相当简单的 WCF 服务,它为一组智能客户端执行单向文件同步。我注意到,当通话过程中出现网络或服务中断时,客户端将无法与服务器通信,直到整个应用程序重新启动。
该服务使用BasicHttpBinding 运行,并使用transferMode="Streamed" 和messageEncoding="Mtom" 托管在IIS6(一个.svc 页面)上。该服务被配置为使用默认的 InstanceContextMode(我认为它是 Per Call?)和 ConcurrencyMode=Single。它使用默认的节流行为,但我处于一个没有其他人可以访问的隔离测试环境中。
客户端是 Windows 服务。我正在使用这个ServiceProxyHelper 来确保Close()'d 或Abort()'d 在Dispose()'d 时正确连接,尽管没有会话,所以我认为这甚至不重要。发生错误时,客户端对象被释放,然后超出范围。检测到异常后,服务稍等片刻,然后创建一个新的客户端对象并重试。所以它应该从失败中恢复,但由于某种原因,所有后续调用服务都失败了。
我可以通过启动客户端来可靠地重现这一点,允许它传输一些文件,然后 iis 重置服务器。首先,客户端通常会显示“服务太忙”错误(映射到您在应用重新启动期间遇到的 IIS 503 错误)。之后,对服务的所有后续调用都会超时。据我所知,客户甚至没有尝试拨打电话。我启用了跟踪,我看到的是:超时错误,然后是“无法通过 HTTP 发送请求消息”警告,然后是另一个超时错误。
疯狂的是,当我将客户端配置为使用 Fiddler(端口 8888)作为 app.config 中的代理时,一切都按预期工作。所以不知何故,作为代理的 Fiddler 正在关闭或完成某种 WCF 本身没有的连接。
想法?
编辑 2009-10-30 8:54PM:将服务属性更改为:InstanceContextMode=Single 和 ConcurrencyMode=Multiple。没有区别。
【问题讨论】:
标签: wcf