在我的应用程序中,同步的Winform UI线程调用WCF方法。 99.99%的时间没问题,但偶尔对WCF方法的调用被锁定,UI冻结。
我知道我可以通过调用异步来阻止UI的冻结 - 我们的大多数WCF调用都是异步的 - 但我们认为使这个特殊的微小方法同步并不是那么糟糕。
当WCF服务中发生锁定时,其他用户也无法访问该服务。我必须重新启动WCF服务主机(Windows服务)才能解决问题。
WCF服务如何被锁定且无法访问? 我想不出一个场景 我们检查了正常运行的数据库。
技术细节: 我们在服务代理中使用代理。当应用程序运行时,此代理服务代理将保持活动状态。
[PreserveReferences]
[OperationContract(IsOneWay = false, AsyncPattern = false, Action = "MyMethod")]
MyType MyMethod();
正在使用的绑定:
<wsHttpBinding>
<binding name="AppWsHttpBindingConfig" transactionFlow="true" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Mtom">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="false" enabled="false" />
<security mode="Message">
<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
答案 0 :(得分:2)
大多数WCF服务挂起问题与处理WCF客户端代理有关,我认为这是您的问题。如果您没有正确处理客户端代理,则在进行(maxConcurrentSessions + 1)第n次调用时会出现超时异常。
请查看this文章。
基本上它表示,如果您的频道未处于故障状态,则在该频道上调用Abort
可释放客户端资源,但不会释放服务器资源。例如,当服务方法抛出FaultException
时,它不会将通道置于故障状态。因此,在此代理上调用abort将导致服务器中没有客户端的打开会话。
这是你的情况,你应该考虑使用那篇文章中描述的方法,或其他一些有相同想法的方法。