日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WCF消息之XmlDictionaryWriter

發(fā)布時間:2023/12/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WCF消息之XmlDictionaryWriter 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

XmlDictionaryWriter,是一個抽象類,從該類中派生了WCF,以便執(zhí)行序列化和反序列化。

?

它有4種格式書寫器:

CreateBinaryWriter,用于創(chuàng)建寫入WCF二進(jìn)制xml格式的實(shí)例

CreateMtomWriter,用于創(chuàng)建以MTOM格式mxl的實(shí)例

CreateTextWriter,用于創(chuàng)建寫入文本xml的實(shí)例

?

(一)CreateTextWriter

以文本格式寫入xml,工廠方法有3個重載:

CreateTextWriter(Stream)

CreateTextWriter(Stream, Encoding)

CreateTextWriter(Stream, Encoding, Boolean)

?

其中第三個方法中的bool參數(shù)用于指定流操作:如果為 true,則完成時編寫器關(guān)閉流;否則為 false。而字符編碼Encoding默認(rèn)的是utf-8。且只支持utf-8,或unicode大頭或小頭三種編碼。

unicode大頭小頭就是:Big-EndianLittle-Endian(直譯過來就是大頭結(jié)尾,小頭結(jié)尾)。其中big-endian是在低地址放高位字節(jié),另一個則相反。例如:0x12345678這個16進(jìn)制的數(shù)字

big-endian

低地址——高地址

12345678

?

Little-endian

低地址——高地址

78|56|34|12

(說實(shí)在的,big-endian更符合人們的習(xí)慣)

例如:字的unicodebig-endian(可以在記事本中寫個趙字,然后保存時編碼選擇big-的,然后在ultra中打開,看它的16進(jìn)制編碼),只看它的BOM部分就知道了:FE FF

在程序中這個編碼可以由Encoding的屬性來設(shè)置:Encoding.BigEndianUnicode

?

public void TestTextWriter()

{

??? MemoryStream ms = new MemoryStream();

using (XmlDictionaryWriter writer =

XmlDictionaryWriter.CreateTextWriter(ms,

Encoding.BigEndianUnicode, false))

??? {

writer.WriteStartDocument();

writer.WriteElementString("UserName", "Songjiang");

writer.Flush();

??? }

?

??? byte[] bb = ms.ToArray();

??? Console.WriteLine(BitConverter.ToString(bb));

?

??? ms.Position=0;

??? Console.WriteLine(new StreamReader(ms).ReadToEnd());

?

??? ms.Close();

}

這里的工廠方法的第三個參數(shù)指定為了false,設(shè)置在完成wirter的關(guān)閉后,不自動關(guān)閉對應(yīng)流,因?yàn)楹筮呥€要用到這個流。用完后再顯示關(guān)閉可以了。

它的輸出為:

FE-FF-00-3C-00-3F-00-78-00-6D-00-6C-00-20-00-76-00-65-00-72-00-73-00-69-00-6F-00-6E-00-3D-00-22-00-31-00-2E-00-30-00-22-00-20-00-65-00-6E-00-63-00-6F-00-64-00-69-00-6E-00-67-00-3D-00-22-00-75-00-74-00-66-00-2D-00-31-00-36-00-42-00-45-00-22-00-3F-00-3E-00-3C-00-55-00-73-00-65-00-72-00-4E-00-61-00-6D-00-65-00-3E-00-53-00-6F-00-6E-00-67-00-6A-00-69-00-61-00-6E-00-67-00-3C-00-2F-00-55-00-73-00-65-00-72-00-4E-00-61-00-6D-00-65-00-3E

?

<?xml version="1.0" encoding="utf-16BE"?><UserName>Songjiang</UserName>

?

字符編碼可以在流字節(jié)和xml看出來:FEFFBOM,和encoding=”utf-16be”

?

再看看utf-8編碼下的情況(只在CreateTextWriter方法中將編碼改為utf-8即可):

3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E-30-22-20-65-6E-63-6F-64-69-6E-67-3D-22-75-74-66-2D-38-22-3F-3E-3C-55-73-65-72-4E-61-6D-65-3E-53-6F-6E-67-6A-69-61-6E-67-3C-2F-55-73-65-72-4E-61-6D-65-3E

<?xml version="1.0" encoding="utf-8"?><UserName>Songjiang</UserName>

?

Utf-8BOMEF BB BF,但這里的字節(jié)卻沒有??梢?#xff0c;對于Text wirter來說,utf-8編碼下,utf-8BOM是省略的,在組包過程中,這點(diǎn)要注意。

?

(二)CreateBinaryWriter

MTOM格式寫入xml,工廠方法有2個重載:

CreateMtomWriter(Stream, Encoding, Int32, String)

CreateMtomWriter(Stream, Encoding, Int32, String, String, String, Boolean, Boolean)?

?

這里說一下第一個方法:

2個參數(shù)不用說,一個管流,一個管字符編碼。然后是int參數(shù),用于設(shè)置緩沖的最大字節(jié)數(shù),第4個字串型用于設(shè)置soap頭中的ContentType屬性。(ContentType用于描述內(nèi)容類型的字符串,格式通常為:類型/字類型,其中類型為常規(guī)內(nèi)容范疇,而子類為特定內(nèi)容類型。對于這個,可以網(wǎng)上找下,例如:text/html

public void TestMTOMWriter()

{

??? MemoryStream ms = new MemoryStream();

XmlDictionaryWriter _writer =

XmlDictionaryWriter.CreateMtomWriter(ms,

Encoding.UTF8, 1000, "Application/soap+xml");

??? _writer.WriteStartDocument();

??? _writer.WriteElementString("UserName", "Songjiang");

?

??? _writer.Flush();

?

??? byte[] bb = ms.ToArray();

?

??? Console.WriteLine(BitConverter.ToString(bb));

??? StreamReader sr = new StreamReader(ms);

??? ms.Position = 0;

??? string sx = sr.ReadToEnd();

??? Console.WriteLine(sx);

??? ms.Close();

??? sr.Close();

}

結(jié)果:

4D-49-4D-45-2D-56-65-72-73-69-6F-6E-3A-20-31-2E-30-0D-0A-43……省略

?

MIME-Version: 1.0

Content-Type: multipart/related;type="application/xop+xml";

boundary="551a8456-58c9-46ff-b481-f81747b71098+id=1";

start="<http://tempuri.org/0/634052866078593750>";

start-info="Application/soap+xml"

?

--551a8456-58c9-46ff-b481-f81747b71098+id=1

Content-ID: <http://tempuri.org/0/634052866078593750>

Content-Transfer-Encoding: 8bit

Content-Type: application/xop+xml;charset=utf-8;type="Application/soap+xml"

?

<?xml version="1.0" encoding="utf-8"?><UserName>Songjiang</UserName>

--551a8456-58c9-46ff-b481-f81747b71098+id=1--

?

看第二個方法:

CreateMtomWriter(Stream, Encoding, Int32, String, String, String, Boolean, Boolean)

4個參數(shù)已經(jīng)說過,

Stream stream,

Encoding encoding,

int maxSizeInBytes,

string startInfo,

string boundary,

string startUri,

bool writeMessageHeaders,

bool ownsStream

?

現(xiàn)在說后4個,從字面上可以看出,第5個用于設(shè)置MIME邊界字串,第6個用于設(shè)置MIME部分的ID uri,第7個用于設(shè)置是否寫入消息頭,最后一個用于設(shè)置在完成writer的關(guān)閉時,是否關(guān)聯(lián)關(guān)閉對應(yīng)流。也寫一個例子:

XmlDictionaryWriter _writer = XmlDictionaryWriter.

CreateMtomWriter(ms, Encoding.UTF8, 1000, "Application/soap+xml"

,"thisisBoundary============","startUri===1234567890",true,false);

?

MIME-Version: 1.0

Content-Type: multipart/related;type="application/xop+xml";

boundary="thisisBoundary============";

start="<startUri===1234567890>";

start-info="Application/soap+xml"

?

--thisisBoundary============

Content-ID: <startUri===1234567890>

Content-Transfer-Encoding: 8bit

Content-Type: application/xop+xml;charset=utf-8;type="Application/soap+xml"

?

<?xml version="1.0" encoding="utf-8"?><UserName>Songjiang</UserName>

--thisisBoundary============--

其中,黑體部分標(biāo)出了邊界和起始標(biāo)識串的位置,而斜體字部分就是消息頭,這部分由這個方法的第7個布爾參數(shù)來控制。(對于邊界,它以一行開始,且前2個字符為--,而總邊界結(jié)束也由結(jié)尾,還要注意起始頭添加了一對尖括號,這些內(nèi)容可以查閱相關(guān)文檔)

對于soap中的MIME附件,這個方法可以很好的實(shí)現(xiàn)。

(三)CreateMtomWriter

以二進(jìn)制寫入xml

它有4個重載方法:

CreateBinaryWriter(Stream)

CreateBinaryWriter(Stream, IXmlDictionary)

CreateBinaryWriter(Stream, IXmlDictionary, XmlBinaryWriterSession)

CreateBinaryWriter(Stream, IXmlDictionary, XmlBinaryWriterSession, Boolean)

?

它的參數(shù)為:

Stream stream,

IXmlDictionary dictionary,

XmlBinaryWriterSession session,

bool ownsStream

?

其中,第一個與第四個就不說了,第二個表示用于壓縮的XmlDictionary對象,如果不壓縮則寫null,第三個用于允許發(fā)送者和接收者自動創(chuàng)建和協(xié)調(diào)一個動態(tài)的XmlDictionary

?

public void TestBinaryWriter()

{

??? MemoryStream ms = new MemoryStream();

XmlDictionaryWriter _writer =

XmlDictionaryWriter.CreateBinaryWriter(ms, null,null);

?

??? _writer.WriteStartDocument();

?? ?_writer.WriteElementString("UserName", "Songjiang");

??? _writer.Flush();

?

??? byte[] bb = ms.ToArray();

?

??? Console.WriteLine(BitConverter.ToString(bb));

?

??? StreamReader sr = new StreamReader(ms);

??? ms.Position = 0;

??? string sx = sr.ReadToEnd();

??? Console.WriteLine(sx);

??? _writer.Close();

??? ms.Close();???

??? sr.Close();

}

結(jié)果:

40-08-55-73-65-72-4E-61-6D-65-99-09-53-6F-6E-67-6A-69-61-6E-67

@€serName? Songjiang

?

更多詳細(xì)內(nèi)容請見:

http://www.cnblogs.com/frank_xl/archive/2009/12/01/1614830.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的WCF消息之XmlDictionaryWriter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。