2009-06-05 146 views
4

當我使用內置的Visual Studio模板創建一個WCF應用程序並嘗試在循環中調用它時,只有5個請求可以通過。該服務然後停止響應。我可以解決這個問題的唯一方法是在每次通話後關閉連接。如何讓WCF自動關閉連接?

我知道你應該清理完自己,但我也知道你不需要使用web服務來做這件事。很多將要我們服務的人不會關閉他們的聯繫。

有沒有辦法讓WCF獲得相同的行爲?

這裏是我的配置

<system.serviceModel> 
    <services> 
     <service name="WorkflowLibrary1.Workflow1" behaviorConfiguration="WorkflowLibrary1.Workflow1.Service1Behavior"> 
     <endpoint address="" binding="wsHttpContextBinding" contract="WcfServiceLibrary1.IService1"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WorkflowLibrary1.Workflow1.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

代碼在哪裏?另外,WCF是Web服務。你指的是舊的ASMX技術嗎?你該死的_do_必須清理一個ASMX代理 - 如果你不這樣做,它可能會以不同的方式失敗。 – 2009-06-05 01:43:26

+0

我明白自己應該清理自己,但基於這種新方式,如果有人與我們的服務集成並且沒有正確關閉連接,基本上可能會導致我們的服務器無法正常運行! – 2009-06-05 08:07:36

回答

1

5個連接很可能來自服務器 - 您可以通過服務器serviceThrottling行爲的方式定義最大打開的會話,最大併發呼叫,和max server實例的數量。

與此同時,這將允許您增加同時打開的會話的數量,我仍然會建議您妥善清理自己 - 即使您不必在過去的日子裏...... 。

我建議包裝使用您的客戶端代理的成using聲明,如下所示:

using(ClientProxy proxy = new ClientProxy()) 
{ 
    // go ahead, call your service methods 
} 

更新:作爲評註者所正確指出的,這有它的莎爾因爲客戶可能在被處置時拋出異常。所以這可能不是真的很好 - 或者你需要圍繞它打包try...catch以處理客戶端代理關閉導致問題的情況。

參見Avoiding Problems with the Using Statement


這樣一來,客戶端代理將自動關閉並設置當使用塊端部的到服務器的範圍,並從客戶端的信道被釋放,並且所述服務器是就緒接收另一個客戶的另一個電話。

此外,使用wsHttpContextBinding,您應該檢查您是否確實需要默認啓用的會話 - 建議的最佳做法是使用服務器上的每次調用實例,例如,每個調用者實例化一個新的服務器對象。會議引入了一系列新問題和潛在的陷阱,所以我會嘗試僅在真正需要(並從中受益)時才使用它們 - 否則關閉會話。

馬克