Chapter 6: Channels

第6章:通道(Channel)

Overview

概述

Channels in Perspective

正確認識Channel

The Channel State Machine

通道狀態機

Introduction to Channel Shape

通道形狀

Channel Interfaces and Base Types

通道接口和基本類型

Channel Flavors

通道功能

Creating a Custom Channel

自定義通道

Summary

本章小結

 

第6章:通道(Channel)

概述

通道發送和接收消息。通道負責傳輸和WS-*協議的實現、安全以及事務處理。通道是高組合性的-換句話説,它可以通過多種方式組合以實現應用程序需要的功能。通道是可擴展的,並且內部設計的WCF API也允許開發人員自定義通道。

 

絕大部分上,通道不會出現在主流的應用程序開發人員使用的API裏。從另外一個角度來看,Framework的開發人員,可以創建自定義通道,然後通過這些自定義傳輸或者協議來傳輸消息。理解通道內部實現對於應用程序開發人員和framework開發人員來説都十分重要。畢竟,通道是WCF應用程序的核心構件。本章會詳細介紹通道的本質,適合讀者為應用程序和framework開發人員。

着重指出的是,要構建高質量的通道必須有一個異步接口。如果你還沒有接觸過異步編程的知識,在編寫自定義通道以前學習一下這些知識會事倍功半。我個人認為,最好的學習資料就是Jeffrey Richter的《CLR via C#》(Microsoft Press, 2006)

 

正確認識通道(Channel)

在程序裏,通道一般都是和消息通信密切相關的。如果一個WCF應用程序是安全的、可靠的和支持事務處理的,那麼這個程序一定是使用一個通道提供安全性,另外一個通道提供可靠性,再一個通道提供事務能力支持。因為每個通道都有自己特定的功能,而大部分程序需要的功能超出了一個通道的能力範圍,所以WCF應用程序組織適合的通道在一個堆棧裏,然後使用堆棧裏提供的功能。幾乎沒有任何一個產品孤立地使用一個通道。

WCF程序只會使用堆棧頂端的通道。當入棧以後,通道會執行特定的工作,然後在調用堆棧裏的下一個通道(或者調用下一個通道,然後在調用返回之前繼續做自己的工作)。這裏很重要的一點是,一旦消息被髮送到堆棧裏的通道里,通道堆棧會在其內部推進,或者拉回消息。沒有任何外部的控制器來管理在內部通道之間的消息輪轉。當一個程序建立了一個通道堆棧,這個堆棧就是一個外部不透明的實體。如你將會在本章裏看到的一樣,我們也許可以查詢通道堆棧裏的特定功能,但當第一次接觸像通道這樣重要的主題的時候,這個與我們希望的完全透明的東西,還差的很遠。

當通道在堆棧裏組裝完畢,它的結構會説明程序的許多特性,並且堆棧裏的每個通道在整個程序的功能裏都扮演着不同的角色。絕大部分上,通道堆棧在頂部通道接受或者返回一個Message,而堆棧底部通道會從傳輸層生成或者接受字節流。在接受程序的通道堆棧裏,換句話説,底部通道會接受字節流,然後頂部通道會返回一個Message對象。中間發生了什麼取決於內部駐留的通道。通常通道堆棧中間的通道都是關於WS-*協議或者安全規範的物理實現。圖6-1演示了一個消息發送程序的通道堆棧結構。



 


VOLUME KMSCLIENT channel_#工作

圖6-1:一個典型的通道堆棧



 

注意到底部堆棧接受一個Message輸入並且輸出字節流到傳輸層。底層通道也會負責特定的傳輸通信工作。如果是TCP傳輸,這個通道就會負責socket連接和發送字節流到socket。如果是MSMQ傳輸,底層通道會負責連接懂啊一個MSMQ隊列,然後發送消息到這個隊列裏。注意到圖6-1,傳輸層之上的通道在消息處理過程中都有不同的作用(例如,事務、安全和可靠性)。

沒有一個具體的,萬能的通道類型。WCF類型系統包含許多通道類型的定義,並且每個通道類型定義都有特定的目的。例如,所有WCF裏支持的傳輸至少有一個通道類型定義,它們提供了WCF程序通過傳輸層通信的物理方式。同樣,WCF類型系統也包含許多通道類型,它們是可靠性、事務處理和安全等高級特性的物理實現方式。

實例化Channel

工廠對象實例化通道對象。大部分情況,工廠對象和通道對象存在一對一的關聯。換句話説,每個通道類型都有一個與之對應的工廠類型。沒有萬能的通道類型,也沒有萬能的工廠類型。因為通道經常在運行時組織的,所以創建通道的工廠對象也經常是在運行時組織到堆棧裏的。在某種意義上説,堆棧裏的工廠對象的組織方式表明了通道的組織方式。你會在第7章:“通道管理器”裏學習到更詳細的內容。現在,我們知道了通道不是在用户的代碼中創建的,而是由WCF定義的通道工廠創建的。

 

老徐備註:

1. CLR Via C#:Second Edition,中文譯名:框架設計(第2版):CLR Via C# 。另外一本Jeffrey Richter名著《Applied Microsoft .NET Framework programming》中文譯名《Microsoft .NET框架程序設計(修訂版)》。都是經典。


 

【老徐的博客】【作      者】:Frank Xu Lei【地      址】:

【中文論壇】:微軟WCF中文技術論壇【英文論壇】:微軟WCF英文技術論壇