WCF服务如何被锁定?

WCF服务如何被锁定?,wcf,locked,Wcf,Locked,在我的应用程序中,WinFormUI线程同步调用WCF方法。 99.99%的情况下这是可以的,但偶尔对WCF方法的调用会被锁定,UI会冻结 我知道我可以通过使调用异步(我们的大多数WCF调用都是异步的)来防止UI冻结,但是我们认为使这个特定的小方法同步并没有那么糟糕 当WCF服务中发生锁定时,其他用户也无法访问该服务。我必须重新启动WCF服务主机(Windows服务)才能解决此问题 WCF服务如何可能被锁定和无法访问? 我想不出什么情况。 我们检查了数据库,数据库照常运行 技术细节: 我们在服务

在我的应用程序中,WinFormUI线程同步调用WCF方法。 99.99%的情况下这是可以的,但偶尔对WCF方法的调用会被锁定,UI会冻结

我知道我可以通过使调用异步(我们的大多数WCF调用都是异步的)来防止UI冻结,但是我们认为使这个特定的小方法同步并没有那么糟糕

当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>

大多数WCF服务挂起问题都与处理WCF客户端代理有关,我认为这就是您的问题所在。如果未正确处理客户端代理,则在进行(maxConcurrentSessions+1)第n次调用时将出现超时异常

请看这篇文章

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


这是你的情况,你应该考虑使用这篇文章中所描述的方法,或者其他一些想法相同的。

只是要清楚,你是自己主持WCF服务的吗?你有什么样的绑定?wsHttp,nettcp???@Jonathan我们有一个Winform客户端,它在服务器上调用一个方法;WCF服务托管在此服务器上的Windows服务中。@Yiğit wsHttpBinding;我添加了绑定配置。@Gerard它可能与处理客户端代理有关。此代码块用于关闭/中止代理。如果你还不知道的话,看看吧。这看起来很有希望,我没有意识到wsHttpBinding使用会话。使用establishSecurityContext=“false”如何?@Gerard我认为这取决于您的服务和应用程序的性质。如果您的客户机连续打了很多电话,或者您的服务被许多请求击中,那么将此设置为false将导致性能崩溃。我真的猜测,从性能的角度来看,这种身份验证根本不是最好的