Dot-Net

為什麼我的 WCF 服務在 10 次呼叫後返回 FaultException,超時?

  • November 9, 2011

我有一個有時必須返回故障的 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 )

希望這可以幫助…

引用自:https://stackoverflow.com/questions/986324