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