自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

WCF消息頭基本應(yīng)用技巧講解

開發(fā) 開發(fā)工具
我們今天將會通過這篇文章中介紹的內(nèi)容為大家詳細介紹一下有關(guān)WCF消息頭的類型,以及相關(guān)創(chuàng)建方法,以方便大家理解。

WCF中有一種叫做MessageHeaders的消息頭,能夠幫助我們在實際應(yīng)中獲得很大的幫助。那么今天,我們將會在這里為大家詳細介紹一下有關(guān)WCF消息頭的基本應(yīng)用方法,希望能給大家?guī)硪恍椭?t#

WCF消息頭類型

因為SOAP消息可能包含很多消息頭塊,所以在一個Message類型里,我們需要一種表示一組消息頭塊對象的方法。MessageHeaders就是這個作用,并且它定義了一個MessageHeaders類型的只讀屬性Headers。Headers屬性是我們在Message里增加、修改、查詢和移除MessageHeader的主要方式。在某種意義上,本節(jié)主要是講解MessageHeaders類型,以及可以應(yīng)用到Message類型的Headers屬性上的所有信息。與Message相反,在實例化一個Message之后,我們可以隨便修改Headers屬性的內(nèi)容。MessageHeaders是一個具體類,而不是抽象類,它不包含工廠方法。這一點值得注意,因為本章討論過的類型都是抽象的并且定義了工廠方法。

像前面提到的一樣, MessageHeaders,在一定層次上,是一組MessageHeader對象。MessageHeader類型的對象模型,奇怪的是少了一個可以返回MessageHeader對象集合的成員。作為替代,MessageHeaders實現(xiàn)了IEnumerable<MessageHeaderInfo> and IEnumerable接口。這意味著我們可以簡單地迭代MessageHeaders類型來查看所有的消息頭塊(在MessageHeaders對象賦值以后)。

注意

為了完整,我必須提下MessageHeaderInfo類型,它是MessageHeader的基類。MessageHeaderInfo定義了幾個表示SOAP消息頭塊的屬性,比如:Actor、MustUnderstand等等。太白地說,我們看不出這個類型存在的理由,因為MessageHeader是抽象的。

創(chuàng)建一個WCF消息頭對象

MessageHeaders類型定義了三個公開的構(gòu)造函數(shù)。這里要著重指出的是絕大多數(shù)開發(fā)人員都不會直接使用這些構(gòu)造函數(shù),因為Message類型(子類型)底層機制會為你調(diào)用其中的一個構(gòu)造函數(shù)。如果你要選擇繼承Message類型的話,或許需要調(diào)用其中一個構(gòu)造函數(shù)去設(shè)置Message的消息頭部分。

其中一個構(gòu)造函數(shù)接受MessageHeaders類型的參數(shù)。構(gòu)造函數(shù)會對MessageHeaders執(zhí)行深拷貝,并把它存儲在MessageHeaders實例里。

另外一個構(gòu)造函數(shù)接受一個MessageVersion類型的參數(shù),如你所料,這是設(shè)置MessageHeaders 實例的SOAP version和WS-Addressing version。***一個構(gòu)造函數(shù)接受一個MessageVersion類型和一個Int32類型的參數(shù)。這個構(gòu)造函數(shù)設(shè)置SOAP和WS-Addressing的版本,同樣包括內(nèi)部消息頭塊list里元素的個數(shù)。記住實際元素的個數(shù)可以超過Int32設(shè)置的個數(shù)。如果我們知道將要增加到MessageHeaders對象里的消息頭的個數(shù),使用這個重載方法,它會提升性能,因為在對象的整個生命周期里早期的時候,已經(jīng)設(shè)置好了合適的存儲空間。

添加一個WCF消息頭

一旦MessageHeaders對象實例化完畢,我們需要給它增加一個或者多個MessageHeader對象。MessageHeaders類型定義了接受一個MessageHeader 對象作為參數(shù)的Add方法。然后把插入MessageHeader 對象插入到消息頭塊列表的最末端。

如果我們需要把MessageHeader對象插入到特定的位置,我們可以使用Insert方法。它接受一個Int32 和MessageHeader類型的參數(shù)。Int32類型的參數(shù)表示要插入的位置,MessageHeader參數(shù)是要插入的對象。非常有意思的是MessageHeaders把MessageHeader對象存放在一個數(shù)組結(jié)構(gòu)中。如果我們傳遞的索引大于數(shù)組的大小,方法會拋出一個ArgumentOutOfRangeException。

獲取WCF消息頭的值

當(dāng)一個程序接收、解碼和反序列化一個stream到Message對象的時候,我們經(jīng)常需要獲取一個或者多個消息頭塊的值。因為MessageHeader類型提供了多種方式,我們必須求助于MessageHeaders類型。

一種方式,我們在MessageHeaders對象里獲取特定的MessageHeader,就是使用索引。為了找到特定消息頭塊的索引,我們可以調(diào)用兩個FindHeader方法。它們都接受表示nam和namespace的String參數(shù)。其中一個方法接受一個表示能夠與消息頭塊交互的actor的String參數(shù)。它們的返回值都是Int32。如果沒有匹配的消息頭塊,F(xiàn)indHeader回返回-1。如果找到多個消息頭塊,會返回***個匹配的消息頭塊的索引。

備注

我的觀點,這不是一個良好的設(shè)計, 它違反了Microsoft文檔里已經(jīng)規(guī)定的***實踐和關(guān)于framework設(shè)計的內(nèi)部標(biāo)準。它應(yīng)該命名為為TryFindHeader或者如果沒有找到匹配的消息頭就應(yīng)該拋出一個異常。拋開我的看法,當(dāng)調(diào)用FindHeader方法的時候,我們必須檢查返回的值是否為-1。

在找到消息頭塊的索引以后(只要不是-1),我們隨后就可以檢查消息頭塊的值。為此,我們調(diào)用其中一個GetHeader<T> 方法。重載的方法接受各種參數(shù),包括一個消息頭塊的索引和一個自定義的序列化器。其中三個重載方法接受的String參數(shù)可以映射到FindHeader方法接受的參數(shù)上。內(nèi)部來看,這些重載方法調(diào)用適當(dāng)?shù)腇indHeader方法,并且檢查返回的值是否是-1.與FindHeader相反,如果沒有找到匹配的消息頭塊,GetHeader<T>方法會拋出個異常。

責(zé)任編輯:曹凱 來源: CSDN
相關(guān)推薦

2010-02-25 10:52:29

WCF響應(yīng)服務(wù)

2010-02-25 18:04:02

WCF IIS宿主

2010-03-01 15:40:04

WCF實例停用

2010-03-01 16:04:31

WCF服務(wù)契約

2010-03-01 09:48:23

WCF會話服務(wù)

2010-03-01 18:11:40

WCF數(shù)據(jù)契約變更

2010-03-01 11:24:31

WCF面向服務(wù)

2010-02-23 15:58:57

WCF Session

2010-02-22 16:19:25

WCF自托管

2010-03-04 14:57:08

Python解密VBS

2009-12-21 14:49:27

2010-02-22 17:21:02

WCF消息交換

2010-02-25 09:50:30

WCF路由截獲消息

2009-11-23 11:03:12

php_curl庫

2010-01-25 13:45:04

Android單選框

2010-02-23 14:17:20

WCF配置文件

2013-12-12 16:10:21

Lua腳本語言

2010-02-06 16:16:01

C++冒泡排序

2010-02-23 09:44:12

WCF dataCon

2010-02-25 16:45:13

WCF應(yīng)用技巧
點贊
收藏

51CTO技術(shù)棧公眾號