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

鶴慶網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,鶴慶網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為鶴慶上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的鶴慶做網(wǎng)站的公司定做!
WCF消息頭類型
因?yàn)镾OAP消息可能包含很多消息頭塊,所以在一個(gè)Message類型里,我們需要一種表示一組消息頭塊對(duì)象的方法。MessageHeaders就是這個(gè)作用,并且它定義了一個(gè)MessageHeaders類型的只讀屬性Headers。Headers屬性是我們?cè)贛essage里增加、修改、查詢和移除MessageHeader的主要方式。在某種意義上,本節(jié)主要是講解MessageHeaders類型,以及可以應(yīng)用到Message類型的Headers屬性上的所有信息。與Message相反,在實(shí)例化一個(gè)Message之后,我們可以隨便修改Headers屬性的內(nèi)容。MessageHeaders是一個(gè)具體類,而不是抽象類,它不包含工廠方法。這一點(diǎn)值得注意,因?yàn)楸菊掠懻撨^的類型都是抽象的并且定義了工廠方法。
像前面提到的一樣, MessageHeaders,在一定層次上,是一組MessageHeader對(duì)象。MessageHeader類型的對(duì)象模型,奇怪的是少了一個(gè)可以返回MessageHeader對(duì)象集合的成員。作為替代,MessageHeaders實(shí)現(xiàn)了IEnumerable
注意
為了完整,我必須提下MessageHeaderInfo類型,它是MessageHeader的基類。MessageHeaderInfo定義了幾個(gè)表示SOAP消息頭塊的屬性,比如:Actor、MustUnderstand等等。太白地說,我們看不出這個(gè)類型存在的理由,因?yàn)镸essageHeader是抽象的。
創(chuàng)建一個(gè)WCF消息頭對(duì)象
MessageHeaders類型定義了三個(gè)公開的構(gòu)造函數(shù)。這里要著重指出的是絕大多數(shù)開發(fā)人員都不會(huì)直接使用這些構(gòu)造函數(shù),因?yàn)镸essage類型(子類型)底層機(jī)制會(huì)為你調(diào)用其中的一個(gè)構(gòu)造函數(shù)。如果你要選擇繼承Message類型的話,或許需要調(diào)用其中一個(gè)構(gòu)造函數(shù)去設(shè)置Message的消息頭部分。
其中一個(gè)構(gòu)造函數(shù)接受MessageHeaders類型的參數(shù)。構(gòu)造函數(shù)會(huì)對(duì)MessageHeaders執(zhí)行深拷貝,并把它存儲(chǔ)在MessageHeaders實(shí)例里。
另外一個(gè)構(gòu)造函數(shù)接受一個(gè)MessageVersion類型的參數(shù),如你所料,這是設(shè)置MessageHeaders 實(shí)例的SOAP version和WS-Addressing version。***一個(gè)構(gòu)造函數(shù)接受一個(gè)MessageVersion類型和一個(gè)Int32類型的參數(shù)。這個(gè)構(gòu)造函數(shù)設(shè)置SOAP和WS-Addressing的版本,同樣包括內(nèi)部消息頭塊list里元素的個(gè)數(shù)。記住實(shí)際元素的個(gè)數(shù)可以超過Int32設(shè)置的個(gè)數(shù)。如果我們知道將要增加到MessageHeaders對(duì)象里的消息頭的個(gè)數(shù),使用這個(gè)重載方法,它會(huì)提升性能,因?yàn)樵趯?duì)象的整個(gè)生命周期里早期的時(shí)候,已經(jīng)設(shè)置好了合適的存儲(chǔ)空間。
添加一個(gè)WCF消息頭
一旦MessageHeaders對(duì)象實(shí)例化完畢,我們需要給它增加一個(gè)或者多個(gè)MessageHeader對(duì)象。MessageHeaders類型定義了接受一個(gè)MessageHeader 對(duì)象作為參數(shù)的Add方法。然后把插入MessageHeader 對(duì)象插入到消息頭塊列表的最末端。
如果我們需要把MessageHeader對(duì)象插入到特定的位置,我們可以使用Insert方法。它接受一個(gè)Int32 和MessageHeader類型的參數(shù)。Int32類型的參數(shù)表示要插入的位置,MessageHeader參數(shù)是要插入的對(duì)象。非常有意思的是MessageHeaders把MessageHeader對(duì)象存放在一個(gè)數(shù)組結(jié)構(gòu)中。如果我們傳遞的索引大于數(shù)組的大小,方法會(huì)拋出一個(gè)ArgumentOutOfRangeException。
獲取WCF消息頭的值
當(dāng)一個(gè)程序接收、解碼和反序列化一個(gè)stream到Message對(duì)象的時(shí)候,我們經(jīng)常需要獲取一個(gè)或者多個(gè)消息頭塊的值。因?yàn)镸essageHeader類型提供了多種方式,我們必須求助于MessageHeaders類型。
一種方式,我們?cè)贛essageHeaders對(duì)象里獲取特定的MessageHeader,就是使用索引。為了找到特定消息頭塊的索引,我們可以調(diào)用兩個(gè)FindHeader方法。它們都接受表示nam和namespace的String參數(shù)。其中一個(gè)方法接受一個(gè)表示能夠與消息頭塊交互的actor的String參數(shù)。它們的返回值都是Int32。如果沒有匹配的消息頭塊,F(xiàn)indHeader回返回-1。如果找到多個(gè)消息頭塊,會(huì)返回***個(gè)匹配的消息頭塊的索引。
備注
我的觀點(diǎn),這不是一個(gè)良好的設(shè)計(jì), 它違反了Microsoft文檔里已經(jīng)規(guī)定的***實(shí)踐和關(guān)于framework設(shè)計(jì)的內(nèi)部標(biāo)準(zhǔn)。它應(yīng)該命名為為TryFindHeader或者如果沒有找到匹配的消息頭就應(yīng)該拋出一個(gè)異常。拋開我的看法,當(dāng)調(diào)用FindHeader方法的時(shí)候,我們必須檢查返回的值是否為-1。
在找到消息頭塊的索引以后(只要不是-1),我們隨后就可以檢查消息頭塊的值。為此,我們調(diào)用其中一個(gè)GetHeader
網(wǎng)站名稱:WCF消息頭基本應(yīng)用技巧講解
本文鏈接:http://m.fisionsoft.com.cn/article/dhooosh.html


咨詢
建站咨詢
