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

WCF 技術內幕(38):通道管理器——通道偵聽器深度解析

     編輯:關於.NET

接收端的核心:通道偵聽器

通道偵聽器模仿 Berkeley Socket API:綁定 URI、被動偵聽連入訊息、連線建立後透過 AcceptChannel 回傳通道實例供程式接收資料。所有通道定義 Accept 開頭方法,但僅偵聽器類型真正偵聽訊息。

堆疊運作模型

通道偵聽器堆疊中,傳輸層偵聽器位於最底層,唯一綁定位址並開始偵聽。上層偵聽器依序呼叫下層 Accept 方法,直到最底層傳輸偵聽器。面向連線傳輸(TCP、Named Pipe)接收訊息後回傳通道;非連線傳輸(MSMQ)立即回傳通道無需等待。

核心介面體系

IChannelListener

基礎介面,繼承 ICommunicationObject,定義:

  • WaitForChannel 同步/非同步等待通道可用
  • Uri 屬性取得偵聽位址
  • GetProperty<T>() 查詢機制

不繼承 IChannel,避免偵聽器被誤用為通道,確保堆疊查詢功能正常。

IChannelListener<TChannel>

泛型介面,繼承 IChannelListener,泛型限制 TChannel : class, IChannel。引入 Berkeley Socket Accept 模式:

  • AcceptChannel() / AcceptChannel(TimeSpan)
  • 非同步對應 BeginAcceptChannel / EndAcceptChannel

偵聽器必須引用特定通道形狀(Shape)並以此建立通道,這與通道「實作」形狀不同。

基底類別架構

ChannelListenerBase

抽象類別,繼承 ChannelManagerBase、實作 IChannelListener、ICommunicationObject。建構子接受 IDefaultCommunicationTimeouts 設定四大逾時屬性(開啟、關閉、接收、傳送),預設 1 分鐘。Binding 實作此介口,可透過建構子傳遞自訂逾時。

ChannelListenerBase<TChannel>

繼承 ChannelListenerBase、實作 IChannelListener<TChannel>。提供 AcceptChannel 實作,核心擴充點為受保護抽象方法:

  • OnAcceptChannel(TimeSpan)
  • OnBeginAcceptChannel / OnEndAcceptChannel

實戰:建立自訂委派通道偵聽器

建立泛型 DelegatorChannelListener<TShape>(TShape : class, IChannel):

  • 建構子接收 BindingContext,取得內層偵聽器 _innerListener
  • 私有 WrapChannel:根據 TShape 將內層通道包裝為 DelegatorXxxChannel(接收端形狀:IInputChannel、IReplyChannel、IDuplexChannel 及其 Session 變體)
  • 核心方法 OnAcceptChannel、OnEndAcceptChannel:呼叫內層偵聽器接受通道,非 null 時包裝回傳
  • WaitForChannel、Uri、GetProperty 透傳內層
  • 狀態機方法(OnOpen、OnClose、OnAbort 等)委派內層並列印追蹤

關閉堆疊時,AcceptChannel 回傳 null,包裝方法同步回傳 null。

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