0

在我的应用程序中,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>
4

1 回答 1

2

大多数 WCF 服务挂起问题都与 WCF 客户端代理的处理有关,我认为这是您的问题。如果您没有正确处理客户端代理,当您进行 (maxConcurrentSessions + 1) n-th 调用时,您将收到超时异常。

请查看这篇文章。

基本上它说,如果您的通道没有处于故障状态,则调用Abort该通道会释放客户端资源,但不会释放服务器资源。例如,当服务方法抛出 aFaultException时,它不会将通道置于故障状态。因此,在此代理上调用 abort 将导致您的服务器中没有客户端的打开会话。

无论您是否属于这种情况,您都应该考虑使用该文章中描述的方法,或者其他具有相同想法的方法。

于 2011-07-15T18:46:23.567 回答