首页 / 软件开发 / .NET编程技术 / 《WCF技术内幕》29:第2部分_第5章_消息:使用消息头(下)
《WCF技术内幕》29:第2部分_第5章_消息:使用消息头(下)2011-06-20 博客园 Frank Xu Lei译WS-Addressing 和MessageHeaders类型在前面“MessageHeader类型”一节,我们已经学习了使用 MessageHeader表 一个WS-Addressing终结点。我们会很少手动编写代码来使用一个MessageHeader 去表示WS- Addressing终结点,因为MessageHeaders类型定义了几个表示一个终 结点引用的属性。换句话说,MessageHeaders定义了几个可以增加、修改和删除 WS-Addressing消息头块的方法,并且这个是给Message实例设置消息头块的主要 方法。更确切地说,MessageHeaders类型定义了以下与终结点相关的属性:From, ReplyTo, FaultTo, and To。From、ReplyTo和FaultTo是EndpointAddress的属 性。如前面提到的一样,EndpointAddress类型是对于WS-Addressing 终结点规 范定义的CLR抽象。我们会在下一节里详细学习EndpointAddress类型。根据WS- Addressing规范里的定义,To是Uri类型的属性。MessageHeaders类型同样定义了与其它WS-Addressing规范相关的属性。例如 ,Action、MessageId和RelatesTo属性映射到相似名字的WS-Addressing消息头 块上。Action是String类型,而且非常简单。概括地说,当属性设置完毕,WS- Addressing Action也会在Message序列化的时候序列化。MessageId和RelatesTo属性是UniqueId类型的,而且也很简单。UniqueId类 型很像GUID,但是它借助重载的构造函数,可以使用其它类型。思考下面的代码 :UniqueId uniqueId = new UniqueId();
Console.WriteLine(uniqueId.ToString());
uniqueId = new UniqueId("myuniquevalue");
Console.WriteLine(uniqueId.ToString());
运行代码,产生以下输出:urn:uuid:
myuniquevalue
注意UniqueId对象的值可以是GUID类型的值,也可以是任意String的值。这 是个必要的功能,因为MessageId 和RelatesTo WS-Addressing消息头块是 xs:Uri类型。换句话说,任何值都可以在这里替换。因为WCF遵循WS-Addressing 规范,System.Guid不能表示这些属性。EndpointAddress类型EndpointAddress类型由两个功能:它可以方便地保存目标地址的信息,并且 它是一个序列化WS-Addressing终结点到Message里的方式。换句换说, EndpointAddress类型是经常使用的API之一,但是它同样在Message序列化和反 序列化里起着重要作用。EndpointAddress包装了一个System.Uri对象。因此,所有的 EndpointAddress构造函数某些形式上,都接受一个System.Uri参数。更进一步 说,6个构造函数里有5个接受一个Uri参数,另外一个接受String参数。但是这 个构造函数会从此String参数来构造一个Uri然后调用其它的一个构造函数。 EndpointAddress这个特性使得类型更加好用,如下所示:EndpointAddress address1 = new
EndpointAddress("http://wintellect.com/OrderStuff");
Console.WriteLine("Address1: {0}",address1.ToString());
EndpointAddress address2 = new EndpointAddress(
new Uri("http://wintellect.com/OrderStuff"));
Console.WriteLine("Address2: {0}", address2.ToString());
Console.WriteLine("address1 {0} address2",
(address1 == address2) ? "equals" : "does not equal");