2011-07-15 99 views
0

在我的應用程序中,同步中的Winform UI線程調用WCF方法。 99.99%的時間沒問題,但偶爾對WCF方法的調用變爲鎖定狀態並且UI凍結。WCF服務如何鎖定?

我知道我可以通過調用異步來阻止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

爲了清楚這一點,您是否自行託管您的WCF服務? –

+0

你有什麼樣的綁定? wsHttp,nettcp ??? –

+0

@Jonathan我們有一個Winform客戶端,它調用服務器上的一個方法; WCF服務託管在此服務器上的Windows服務中。 – Gerard

回答

2

大多數WCF服務的掛機問題是關係到處置WCF客戶端代理,我相信這是你的情況的問題。如果您沒有正確地配置客戶端代理,那麼在進行(maxConcurrentSessions + 1)次呼叫時,您將收到超時異常。

請檢查出this文章。

基本上它說,如果你的頻道沒有出現故障狀態,那麼在該頻道上調用Abort就可以釋放客戶資源,但不會釋放服務器資源。例如,當服務方法拋出FaultException時,它不會使通道處於故障狀態。所以在這個代理上調用abort會導致在沒有客戶端的服務器中打開一個會話。

Whell這是你的情況或不是,你應該考慮使用該文章中描述的方法,或者其他一些具有相同想法的方法。

+0

這看起來很有希望,我沒有意識到wsHttpBinding使用會話。如何使用establishSecurityContext =「false」? – Gerard

+1

@Gerard我認爲這取決於你的服務和消費應用程序的性質。如果你的客戶連續打了很多電話,或者你的服務被許多請求設置爲false,那麼這將會導致性能下降。我真的猜測,從性能的角度來看,這種認證並不是最好的。 :) –