WCF技术内幕 第5章 (10)

WS-Addressing终结点规范

WS-Addressing为SOAP消息提供了一种统一的、标准化的寻址方式,这个标准的核心之一就是终结点规范。

MessageHeader类型是对SOAP消息头块的CLR抽象,可以假定MessageHeader对象是对Endpoint参考规范的CLR抽象。

IsReferenceParameter只读属性表示MessageHeader对象是否为一个WS-Addressing引用参数或引用属性。


MessageHeaders类型

SOAP消息可能包含很多消息头块,表示一组消息头块对象的方法,MessageHeaders就是这个作用。

MessageHeaders类型的只读属性Headers是在Message里增加,修改,查询和移除MessageHeader的主要方式。

MessageHeaders是一个具体类,而不是抽象类,它不包含工厂方法。

添加MessageHeader:

            MessageHeaders headers = new MessageHeaders(MessageVersion.Soap12WSAddressingAugust2004);
            headers.Add(messageHeader);
            headers.Insert(0, messageHeader);

获取MessageHeader的值:

            PurchaseOrderInfo purchaseOrderInfo = new PurchaseOrderInfo(1000, DateTime.UtcNow, 10.92d);

            string WSAddNS="http://www.andersoft.com/messageheader";
            MessageHeader messageHeader = MessageHeader.CreateHeader("MessageID", WSAddNS, purchaseOrderInfo);

            Stream stream = new MemoryStream();
            XmlDictionaryWriter writer=XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8);
            messageHeader.WriteHeader(writer, MessageVersion.Soap12WSAddressingAugust2004);

            MessageHeaders headers = new MessageHeaders(MessageVersion.Soap12WSAddressingAugust2004);
            headers.Insert(0, messageHeader);
         
            writer.Flush();
            stream.Position = 0;

            Console.WriteLine(headers.GetHeader<PurchaseOrderInfo>(0).PONumber); //1000
            Console.WriteLine(headers.FindHeader(messageHeader.Name, messageHeader.Namespace)); //0

复制MessageHeaders对象

            Message message = Message.CreateMessage(MessageVersion.Soap12WSAddressingAugust2004, "urn:SomeAction", "Hello WCF");
            message.Headers.Add(MessageHeader.CreateHeader("test", "test", "test"));
            message.Headers.To = new Uri("http://www.andersoft.com/Anders");

            Message message2 = Message.CreateMessage(MessageVersion.Soap12WSAddressingAugust2004, "urn:SomeAction2", "Hello WCF");
            message2.Headers.CopyHeadersFrom(message);

            Console.WriteLine(message2.ToString());
            //<s:Envelope xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
            //  <s:Header>
            //    <a:Action s:mustUnderstand="1">urn:SomeAction2</a:Action>
            //    <a:Action s:mustUnderstand="1">urn:SomeAction</a:Action>
            //    <test xmlns="test">test</test>
            //    <a:To s:mustUnderstand="1">http://www.andersoft.com/Anders</a:To>
            //  </s:Header>
            //  <s:Body>
            //    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello WCF</string>
            //  </s:Body>
            //</s:Envelope>

序列化MessageHeaders对象

            Stream stream = new MemoryStream();
            XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8);
            message2.Headers.WriteHeader(0, writer);

MessageHeaders类型定义了与终结点相关的属性:From、ReplyTo,FaultTo和To,以及Action,MessageId和RelatesTo。

            message2.Headers.From = new EndpointAddress("http://www.andersoft.com/message2");
            message2.Headers.ReplyTo = new EndpointAddress("http://www.andersoft.com/ReplyTo");
            message2.Headers.FaultTo = new EndpointAddress("http://www.andersoft.com/FaultTo");
            message2.Headers.To = new Uri("http://www.andersoft.com/To");
            message2.Headers.Action = "Message2";
            message2.Headers.MessageId = new UniqueId(Guid.NewGuid());
            message2.Headers.RelatesTo = new UniqueId(Guid.NewGuid());

UniqueId类:

Assembly System.Runtime.Serialization.dll, v4.0.30319
namespace System.Xml
{
    // Summary:
    //     A unique identifier optimized for Guids.
    public class UniqueId




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值