程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 《WCF技術內幕》31:第2部分_第6章_通道:概述與正確認識通道

《WCF技術內幕》31:第2部分_第6章_通道:概述與正確認識通道

編輯:關於.NET

概述

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

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

提示:或許你看到過,WCF API是相當復雜的,通道層也不例外。和WCF的其 它部分一樣,學習通道包括兩個主要部分:學習類型層次和學習執行環境。個人 經驗,最好的學習使用通道的方法是花一些時間學習類型層次,並且構建一個簡 單的通道,然後插入到WCF基礎結構裡。在類型層次上花費太多的時間容易迷失 方向,直接自定義一個通道而不知道類型層次關系等於盲人摸象。

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

正確認識通道(Channel)

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

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

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

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

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

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

實例化通道

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved