2011-02-28 71 views
2

我無法將故障通道的概念映射回某些綁定的手動實現。我認爲這個WCF功能很煩人,我想知道是否有任何方法來禁用它。WCF通道故障狀態有幫助嗎?

以TCP爲例。大多數TCP通信都是斷開的。那麼爲什麼一個連接會對通道造成故障並破壞所有以下連接?

並命名管道?

也許我錯了。所以請解釋它爲什麼是一個功能,而不是一個錯誤。

回答

7

FaultedCommunicationObject狀態機的狀態之一,該狀態機被烘焙成許多WCF抽象的實現。它基本上意味着該對象的「遊戲結束」,所以你不會找到任何方法來禁用它。

這當然不是一個錯誤:所有這些文物底層的CommunicationObject狀態機是一個有意識的設計選擇。雖然可能有興趣爭論WCF架構師做出的設計決定,但如果您想使用WCF,最終您只需要接受事情的發展並繼續前進。

您應該將通道看作不僅僅是所使用傳輸的適配器:它是一個更高層次的抽象,它在通信堆棧中封裝了許多不同的層(傳輸,編碼,安全性,會話管理,交易流,雙工等)。

即使查看特定綁定的詳細信息,您也會發現堆棧中很少的元素具有容錯能力,您可以在先前的通信嘗試失敗後安全地重用它們(例如,可能是HTTP協議)。即使你提到的那些(TCP,命名管道)也不像你所建議的那樣容錯。

我認爲CommunicationObject狀態機或類似的東西,或多或少是必不可少的,以便在比其所有組成層/元素的細節更高的層次上進行通道抽象。它使簡單的規則:如果它是Faulted,扔掉它,並創建一個新的。是的,在這種情況下可能會出現一些情況,如果您錯過了可以通過保留一些可以安全地重用的資源來實現的優化,但這是您花費更少的費用來處理通信的簡單抽象。

11

我認爲它是JuvalLöwy's(WCF架構師之一)WCF總體理念的產物。引用他的書編程WCF服務

這[異常系統和使用它的正常方式]是.NET的一個根本缺陷作爲一個平臺。 [這裏] [在拋出異常之後],發生了一些完全出乎意料和可怕的事情。客戶怎麼可能假裝呢?該對象可能會被絕望地破壞,但客戶端仍在繼續使用它。

的想法是,你畢竟,與對象上哪個傳輸信道使用的是對方溝通,如果對象拋出一個異常,它可能無法使用了。這是一個有趣的觀點,但我不確定我是否完全同意(因爲如你所說,在實踐中可能會很煩人)。

+5

+1作爲Juval喜歡說的那樣:*您服務炸燬了 - 所有在那裏的血液和身體部位;你仍然想嘗試再次調用它?* - 不能得到比這更多的圖形:-) – 2011-02-28 18:13:41

0

這是WCF的作用:

Proxy a = new Proxy(); 
a.SomeOp() -> threw exception 
a.SomeOtherOp() -> faulted 

這裏SomeOp「失敗,而不是 'A',所以爲什麼SomeOtherOp要失敗?

這是有道理的,如果

Proxy a = new Proxy(); -> threw exception 
a.SomeOp() -> faulted