程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 《WCF技術內幕》21:第2部分_第5章_消息:WCF XML Stack 和 XmlDictionary

《WCF技術內幕》21:第2部分_第5章_消息:WCF XML Stack 和 XmlDictionary

編輯:關於.NET

WCF XML Stack

Microsoft .NET Framework為了多種用途的XML處理定義了一個豐富的類型集 合。作為一個消息平台,WCF比其他.NET應用需要的正常功能還要多。例如,你 在第2章:“面向服務”裡看到的一樣,WCF能夠產生、發送、接受、處理二進制 或者MTOM編碼的XML消息。因為.NET Framework沒有提供這些功能,WCF API自己 定義類型來實現這些功能,我們可以使用這些類型與Message類型直接交互。換 句話說,WCF API 定義的類型可以轉換Message類型到一個特定編碼格式。在 System.Runtime.Serialization.dll程序集的WCF System.Xml命名空間下,有三 個關鍵的類型定義它們負責序列化和編碼Message類型:XmlDictionary、 XmlDictionaryWriter和XmlDictionaryReader。為了討論盡可能地簡單,我講使 用XML消息片段來闡述這些類型,而不是使用完全格式的SOAP消息。在本章的後 面部分,你會看到這些類型是如何來序列化和編碼Message類型的。

XmlDictionary類型【老徐備注1】

如它的名字的含義一樣,一個XmlDictionary對象是許多對key-value的映射 。很像字典或者詞匯表,XmlDictionary可以用來替代簡單的表達式而不會丟失 任何含義。我們在日常生活裡經常使用這種機制,但是我們卻意識不到它的存在 。考慮下面我說給朋友Rusty的話:“我昨晚看了一部關於潛水艇的電影。” Rusty將會聽到這個消息並且做如下解釋“我昨晚看了一部關於能在水面和水下 航行的容器的電影。”第一句話比第二句話簡單明了的多,它需要較少的表達時 間。這個壓縮和相關處理時間可以節省,因為我和Rusty共享一個詞匯表。只要 Rusty和我明白相同的詞語,我們兩個就可以高效地溝通。如果我對 Rusty說: “這章經過苦思冥想(elucubration)終於完成了,”他估計不知道我在說什麼 。在這個例子裡,我為了節約時間用了一個Rusty 不知道的單詞。因此,一個所 有的參與者都知道的字典(或者是個詞匯表)會提高效率。

冒著把這個比喻搞死的風險,另外有一點它也可以證明。當我對Rusty說,“ 我昨晚看了一部潛水艇的電影,”整個句子本身可以使用幾種不同的方式和語言 表達。如果你知道電影(movie)和潛水艇(submarine)的意思,你或許腦子裡 可以想想到這樣的場景,黝黑的劇場裡(或許可以聞到5塊錢一通的爆米花香) 另外還有熒幕上潛水艇的身影。話句話說,句子裡的這些話激起了現實世界裡的 一些畫面。就XML Infoset和編碼而論,你可以映射XML Infoset到真實世界裡的 “事物”,你也可以把這些話轉換為特定的編碼。

在消息應用裡,XmlDictionary也許被用來壓縮序列化和編碼過的消息大小, 因此可以減小需要發送的消息占用的帶寬。正如人們在高效地交流以前必須有一 個公共的詞匯表一樣,發送者和接受者在消息交換的時候必須使用兼容的 XmlDictionary對象。從內部來看,XmlDictionary定義了一個私有的可以表示 SOAP消息裡元素名字、屬性和XML namespace聲明的key-value對列表。

在直接使用XmlDictionary以前,我們有必要詳細研究一下XmlDictionary實 例裡存儲的數據。XmlDictionary內部存儲的key-value對是 XmlDictionaryString類型的。一個XmlDictionaryString 類型定義的是一個 Int32的Key屬性和一個String類型的值。盡管XmlDictionaryString定義了共有 的構造函數。 XmlDictionaryString也不是由用戶代碼直接創建,而是通過增加 XmlDictionaryString對象到 XmlDictionary實例裡。(我們會在本節的後面部 分看到XmlDictionaryString的例子。)

XmlDictionary定義了一個無參的構造函數,還有一個很少使用的構造函數, 這個構造函數可以接受表示最大XmlDictionaryString 元素個數的Int32數字。 在構造實例結束以後,XmlDictionaryString可以通過調用實例的Add方法加入到 XmlDictionary 裡。Add方法接受一個String類型,返回一個 XmlDictionaryString實例,如下所示:

XmlDictionary dictionary = new XmlDictionary();
List<XmlDictionaryString> stringList = new  List<XmlDictionaryString>();
// add element names to the dictionary and store in  stringList
stringList.Add(dictionary.Add("ReleaseDate"));
stringList.Add(dictionary.Add("GoodSongs"));
stringList.Add(dictionary.Add("Studio"));

因為XmlDictionary.Add方法返回一個XmlDictionaryString的實例,局部變 量dictionary包含3個XmlDictionaryString對象表示“ReleaseDate”、 “GoodSongs”和“Studio”。此外,局部變量stringList 包含相同的3個 XmlDictionaryString對象,存儲在局部變量dictionary裡。因為dictionary的 三個對象不是公開訪問的,所以必須另外存儲一份,這樣做實屬無奈。我們可以 通過迭代訪問局部變量stringList看到每個XmlDictionaryString的Key 和Value 屬性。

Console.WriteLine("entries in Collection:");
foreach (XmlDictionaryString entry in stringList) {
  Console.WriteLine("Key = {0}, Value = {1}", entry.Key,  entry.Value);
}

當前面的代碼執行時,我們看到Key屬性的值自動被賦於每個 XmlDictionaryString:

整個集合如下:

Key = 0, Value = ReleaseDate
Key = 1, Value = GoodSongs
Key = 2, Value = Studio

注意到XmlDictionaryString的Key屬性是由XmlDictionary.Add方法賦值的。

XmlDictionary本身並沒什麼用處;在WCF的XML的堆棧裡它必須和其它的類型 一起使用處理壓縮工作。因此,現在我們看一下XmlDictionaryWriter類型,然 後看看如何協調XmlDictionaryWriter和XmlDictionary一起進行壓縮一個序列化 和編碼過的XML Infoset。

【老徐備注】

1. XmlDictionary:

實現用於優化 Windows Communication Foundation (WCF) 的 XML 讀取器/ 編寫器實現的字典。

字典在常見文本字符串和整數之間建立映射,並為壓縮和解壓縮 XML 提供一 種有效的機制。Windows Communication Foundation (WCF) 使用靜態和動態 2 種字典。

使用靜態字典時,通信的兩端都使用預定義的字典。

使用動態字典時,發送端可以添加其映射不在靜態字典中的新字符串。動態 字典與消息一起在帶外發送。動態字典使用 XmlBinaryWriterSession 和 XmlBinaryReaderSession 類傳輸消息和映射。

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