2010-08-31 182 views
1

我有一個WCF服務,我打電話異步。自定義WCF綁定抑制故障

如果我使用wsHttpBinding調用一個拋出正常.Net異常(即不是FaultException)的方法,那麼我的WCF通道會處於故障狀態 - 這是預期的行爲。

然而,如果我請使用自定義的結合方法相同的方法:

<customBinding> 
    <binding name="httpCompressed" sendTimeout="00:10:00" receiveTimeout="00:10:00"> 
     <httpTransport maxBufferSize="2147483647" 
      maxBufferPoolSize="524288" 
      maxReceivedMessageSize="2147483647" /> 
    </binding> 
</customBinding> 

然後,當我收到異常回,信道被留在打開狀態。這不是一個預期的行爲 - 至少,不是我所知道的。

這是指示customCinding for WCF中的一個bug嗎?這實際上是一個預期的行爲(如果是這樣,指針文檔將是非常好的)。

在此先感謝您的幫助。

大衛·穆林 IMA技術

回答

1

這是expexted。 WsHttpBinding默認設置(使用安全會話)使用PerSession實例。這意味着單個服務實例處理來自代理打開通道的所有請求。如果發生未處理的異常,服務實例將被銷燬並且通道出現故障。代理服務器無法打開多個通道並且無法啓動另一個會話,因此您可以使用故障代理執行的唯一操作是中止它。

您的自定義綁定使用純HTTP傳輸而沒有任何會話。由於使用PerCall實例化。這意味着來自代理的每個請求都由新的服務實例處理。服務實例在每次通話後釋放,故障不會影響通道,因爲下次呼叫將由新的服務實例處理。

+0

嗯。鑑於此,我期望明確地改變我的服務的實例如下: 如果我使用wsHttpBinding,我不會再有一個錯誤的頻道了。情況並非如此 - 我嘗試了所有不同的實例化/併發性排列,並且我始終如一地得到wsHttpBinding錯誤的行爲,而customBinding沒有。 – 2010-09-03 01:08:23

+1

從我的回覆中可能不太清楚,但這裏重要的是一個會話。即使您在通過自定義綁定公開的服務中使用單實例模式,您仍然沒有會話。 – 2010-09-03 07:37:49