首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 技術內幕(32):通道——通道狀態機深度解析

     編輯:關於.NET

ICommunicationObject:統一狀態機契約

所有通道與工廠實作 ICommunicationObject,定義:

  • 六種狀態:Created、Opening、Opened、Closing、Closed、Faulted
  • 開啟/關閉/中止方法(同步與非同步,支援 TimeSpan 逾時)
  • 狀態查詢屬性 State
  • 五個狀態變更事件:Opening、Opened、Closing、Closed、Faulted

CommunicationObject:狀態機的基底實作

抽象類別實作介面,確保行為一致性。關鍵機制:

  • 虛擬方法 OnOpening、OnOpened、OnClosing、OnClosed、OnFaulted:衍生類別可覆寫,**必須呼叫基類實作**以觸發事件
  • 抽象方法 OnOpen、OnBeginOpen、OnEndOpen、OnClose、OnBeginClose、OnEndClose、OnAbort:衍生類別**必須實作**,放置初始化/清理邏輯
  • 抽象屬性 DefaultOpenTimeout、DefaultCloseTimeout:無參數方法使用的預設逾時

狀態轉換流程詳細追蹤

Open / BeginOpen

  1. 檢查狀態:非 Created 拋異常(Opened/Opening 拋 InvalidOperationException,Closed/Closing 拋 ObjectDisposedException),執行緒安全
  2. 狀態 → Opening
  3. 呼叫 OnOpening → 觸發 Opening 事件
  4. 呼叫 OnOpen(衍生類別初始化邏輯)
  5. 呼叫 OnOpened → 狀態 → Opened → 觸發 Opened 事件

Close / BeginClose

類似流程:OnClosing → 事件 → OnClose → OnClosed → 狀態 → Closed → 事件。Close 為優雅關閉,可執行 I/O(如 WS-RM 發送 TerminateSequence)。

Abort

立即關閉,最小 I/O。流程:OnClosing → OnAbort → OnClosed。共享 Closing/Closed 事件。無非同步版本,不接受逾時參數。

狀態對 Close/Abort 的影響

StateCloseAbort
Created呼叫 Abort正常中止
Opening呼叫 Abort正常中止
Opened正常關閉正常中止
Closing無操作正常中止
Closed無操作無操作

Fault

受保護方法,供衍生類別內部錯誤時呼叫。狀態 → Faulted → 呼叫 OnFaulted(通常再呼叫 Abort)。外部不可見。

CommunicationObject 堆疊協調

通道堆疊中,頂層通道負責同步轉換內層通道狀態。OnOpen 中呼叫 _inner.Open(timeout),通常在方法結束前調用,可適當減少傳遞的逾時值。同步機制確保整個堆疊狀態一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved