為什麼我的 WCF 服務在 10 次呼叫後返回 FaultException,超時?
我有一個有時必須返回故障的 WCF 服務。由於某種原因,對我的服務的呼叫開始超時並出現以下錯誤:“請求通道在 00:00:59.8906201 之後等待回复時超時。增加傳遞給請求的呼叫的超時值或增加 SendTimeout綁定上的值。分配給此操作的時間可能是較長超時的一部分。
檢查問題後,出現了一個模式:當服務返回故障 10 次時,超時開始。所以我創建了一個通過以下方式實現的測試服務:
public string GetData(int value) { throw new FaultException("A testerror occured"); }和一個測試客戶端:
protected void RunTestGetData() { using (TestServiceReference.Service1Client client = new WSPerformanceTester.TestServiceReference.Service1Client()) { try { client.GetData(1); client.Close(); outputWriter.WriteLine(string.Format("Call run in thread {0}: GetData()", Thread.CurrentThread.ManagedThreadId)); outputWriter.Flush(); } catch (Exception e) { client.Abort(); client.Close(); outputWriter.WriteLine(string.Format("Error occured in thread {0}: GetData(): {1}", Thread.CurrentThread.ManagedThreadId, e.Message)); outputWriter.Flush(); } } }這只發生在服務返回 FaultException 時。如果我拋出一個正常的異常,服務能夠在第 10 次呼叫後繼續執行。顯然,我想很好地包裝我的異常,所以僅僅拋出正常的異常並不是一個真正的選擇。
為什麼我會遇到這些超時異常?提前感謝您的幫助..
我沒有足夠的積分來評論,所以新的回應……
自託管服務最多只允許 10 個並發連接 - 無論傳輸方式如何。如果您在 IIS/WAS 中執行 WCF 服務,則不必擔心這一點(除非您在 XP/Vista 上,最大並發連接數也是 10)。
在這種情況下,故障異常和正常異常之間的差異可以解釋您所看到的結果。
請記住,正常的未處理異常會使通道出錯。在這樣做時,我假設這會打開一個可用的連接。當您返回故障時,它不會自動使通道故障,因為它允許您對連接執行某些操作並最終處理故障,因為它是可能的“預期”故障,而未處理的異常則不會。
即使您返回錯誤,您仍然需要 Abort() 連接。此外,下面還有非託管資源,因此請務必在您的客戶端/代理的呼叫者上實現 IDisposable。
我認為這可能是因為 WCF 服務的預設行為是 10 個並發會話。FaultExceptions 發生後您是否保持連接打開?您可以嘗試在 BehaviorConfiguration (ServiceThrottling > MaxConcurrentSessions) 中更改此值,看看是否有任何改變。我建議您使用 Microsof 服務配置編輯器檢查預設設置的其他值。( MSDN )
希望這可以幫助…