TCP 和命名管道等數據流導向傳輸會在用戶端與伺服器之間的連續位元組數據流上運作。 這個數據流是由 Stream 對象所實現。 在串流升級中,用戶端想要將選擇性通訊協定層新增至通道堆疊,並要求通道的另一端執行此動作。 數據流升級包含將原始 Stream 物件取代為升級的物件。
例如,您可以直接在傳輸數據流之上建置壓縮數據流。 在此情況下,原始傳輸 Stream 會被替換成一個將壓縮 Stream 包含在內的新傳輸。
您可以套用多個數據流升級,每個升級都會包裝上述數據流。
串流升級的運作方式
流程升級過程有四個組成部分。
升級數據流 啟動器 會開始此過程:在執行期,它可以發起請求至其連線的另一端,以升級通道傳輸層。
升級數據流 接受器 會執行升級:在運行時間,它會從其他計算機接收升級要求,並可能接受升級。
升級 提供者 會在用戶端上建立 啟動器 ,並在伺服器上建立 Acceptor 。
在服務和客戶端的系結上新增了一個流升級Binding 元素,並在執行時創建提供者。
請注意,在多個升級的情況下,啟動器和接受者會封裝狀態機器,以強制執行每個初始化的有效升級轉換。
如何執行串流升級
Windows Communication Foundation (WCF) 提供四 abstract
個您可以實作的類別:
若要實作自定義數據流升級,請執行下列動作。 此程序會在客戶端和伺服器機器上執行最小的資料流升級過程。
建立會實作 StreamUpgradeInitiator 的類別。
覆寫 InitiateUpgrade 方法,以接收需要升級的數據流,並返回升級後的數據流。 此方法會同步運作;有類似的方法可以異步起始升級。
覆寫 GetNextUpgrade 方法以檢查是否有其他升級。
建立會實作 StreamUpgradeAcceptor 的類別。
覆寫 AcceptUpgrade 方法,以接收需要升級的數據流,並返回升級後的數據流。 此方法會同步運作;有類似的方法可以異步接受升級。
覆寫CanUpgrade方法,以判斷在升級過程的此階段中,升級接受者所要求的升級是否受到支援。
建立一個實作StreamUpgradeProvider的類別。 覆寫 CreateUpgradeAcceptor 和 CreateUpgradeInitiator 方法,以傳回步驟 2 和步驟 1 中定義的接受者和啟動者實例。
建立會實作 StreamUpgradeBindingElement 的類別。
在用戶端上覆寫 BuildClientStreamUpgradeProvider 方法,並在服務上覆寫 BuildServerStreamUpgradeProvider 方法。
請在客戶端覆寫BuildChannelFactory方法,並在服務中覆寫BuildChannelListener方法,以新增升級綁定元素至BindingParameters。
將新的數據流升級綁定項新增至伺服器和用戶端電腦上的系結。
安全性升級
新增安全性升級是一般數據流升級程式的特殊版本。
WCF 已經提供兩個綁定項來升級數據流安全性。 傳輸層安全性的組態由 WindowsStreamSecurityBindingElement 和 SslStreamSecurityBindingElement 封裝,並能被設定為加入自定義繫結。 這些綁定項會擴充類別 StreamUpgradeBindingElement ,以建置用戶端和伺服器數據流升級提供者。 這些綁定項有方法可建立特製化安全性數據流升級提供者類別,不是 public
,因此在這兩種情況下,您只需要將綁定項新增至系結。
針對上述兩個綁定項不符合的安全性案例,三個安全性相關 abstract
類別衍生自上述啟動器、接受者和提供者基類:
實作安全性串流升級的流程與之前相同,唯一的不同是您將從這三個類別中獲得衍生。 覆寫這些類別中的附加屬性,以提供安全性資訊給執行階段。
多個升級
若要建立其他升級要求,請重複上述過程:建立StreamUpgradeProvider的其他擴展和綁定元素。 將綁定項新增至系結。 其他綁定項會循序處理,從新增至系結的第一個綁定項開始。 在 BuildChannelFactory 和 BuildChannelListener 每個升級提供者中,都可以決定如何在任何預先存在的升級系結參數上自行分層。 然後,它應該以新的復合升級係結參數取代現有的升級系結參數。
或者,一個升級提供者可以支援多個升級。 例如,您可能想要實作支援安全性和壓縮的自定義數據流升級提供者。 執行下列步驟:
子類別 StreamSecurityUpgradeProvider ,用來撰寫建立啟動器和 Acceptor 的提供者類別。
子類別 StreamSecurityUpgradeInitiator ,請務必覆寫 GetNextUpgrade 方法,以傳回壓縮數據流和安全數據流的內容類型順序。
子類別 StreamSecurityUpgradeAcceptor ,可瞭解其 CanUpgrade 方法中的自定義內容類型。
每次呼叫 GetNextUpgrade 和 CanUpgrade 之後,串流都會升級。