WCF消息头基本应用技巧讲解

开发 开发工具
我们今天将会通过这篇文章中介绍的内容为大家详细介绍一下有关WCF消息头的类型,以及相关创建方法,以方便大家理解。

WCF中有一种叫做MessageHeaders的消息头,能够帮助我们在实际应中获得很大的帮助。那么今天,我们将会在这里为大家详细介绍一下有关WCF消息头的基本应用方法,希望能给大家带来一些帮助。#t#

WCF消息头类型

因为SOAP消息可能包含很多消息头块,所以在一个Message类型里,我们需要一种表示一组消息头块对象的方法。MessageHeaders就是这个作用,并且它定义了一个MessageHeaders类型的只读属性Headers。Headers属性是我们在Message里增加、修改、查询和移除MessageHeader的主要方式。在某种意义上,本节主要是讲解MessageHeaders类型,以及可以应用到Message类型的Headers属性上的所有信息。与Message相反,在实例化一个Message之后,我们可以随便修改Headers属性的内容。MessageHeaders是一个具体类,而不是抽象类,它不包含工厂方法。这一点值得注意,因为本章讨论过的类型都是抽象的并且定义了工厂方法。

像前面提到的一样, MessageHeaders,在一定层次上,是一组MessageHeader对象。MessageHeader类型的对象模型,奇怪的是少了一个可以返回MessageHeader对象集合的成员。作为替代,MessageHeaders实现了IEnumerable<MessageHeaderInfo> and IEnumerable接口。这意味着我们可以简单地迭代MessageHeaders类型来查看所有的消息头块(在MessageHeaders对象赋值以后)。

注意

为了完整,我必须提下MessageHeaderInfo类型,它是MessageHeader的基类。MessageHeaderInfo定义了几个表示SOAP消息头块的属性,比如:Actor、MustUnderstand等等。太白地说,我们看不出这个类型存在的理由,因为MessageHeader是抽象的。

创建一个WCF消息头对象

MessageHeaders类型定义了三个公开的构造函数。这里要着重指出的是绝大多数开发人员都不会直接使用这些构造函数,因为Message类型(子类型)底层机制会为你调用其中的一个构造函数。如果你要选择继承Message类型的话,或许需要调用其中一个构造函数去设置Message的消息头部分。

其中一个构造函数接受MessageHeaders类型的参数。构造函数会对MessageHeaders执行深拷贝,并把它存储在MessageHeaders实例里。

另外一个构造函数接受一个MessageVersion类型的参数,如你所料,这是设置MessageHeaders 实例的SOAP version和WS-Addressing version。***一个构造函数接受一个MessageVersion类型和一个Int32类型的参数。这个构造函数设置SOAP和WS-Addressing的版本,同样包括内部消息头块list里元素的个数。记住实际元素的个数可以超过Int32设置的个数。如果我们知道将要增加到MessageHeaders对象里的消息头的个数,使用这个重载方法,它会提升性能,因为在对象的整个生命周期里早期的时候,已经设置好了合适的存储空间。

添加一个WCF消息头

一旦MessageHeaders对象实例化完毕,我们需要给它增加一个或者多个MessageHeader对象。MessageHeaders类型定义了接受一个MessageHeader 对象作为参数的Add方法。然后把插入MessageHeader 对象插入到消息头块列表的最末端。

如果我们需要把MessageHeader对象插入到特定的位置,我们可以使用Insert方法。它接受一个Int32 和MessageHeader类型的参数。Int32类型的参数表示要插入的位置,MessageHeader参数是要插入的对象。非常有意思的是MessageHeaders把MessageHeader对象存放在一个数组结构中。如果我们传递的索引大于数组的大小,方法会抛出一个ArgumentOutOfRangeException。

获取WCF消息头的值

当一个程序接收、解码和反序列化一个stream到Message对象的时候,我们经常需要获取一个或者多个消息头块的值。因为MessageHeader类型提供了多种方式,我们必须求助于MessageHeaders类型。

一种方式,我们在MessageHeaders对象里获取特定的MessageHeader,就是使用索引。为了找到特定消息头块的索引,我们可以调用两个FindHeader方法。它们都接受表示nam和namespace的String参数。其中一个方法接受一个表示能够与消息头块交互的actor的String参数。它们的返回值都是Int32。如果没有匹配的消息头块,FindHeader回返回-1。如果找到多个消息头块,会返回***个匹配的消息头块的索引。

备注

我的观点,这不是一个良好的设计, 它违反了Microsoft文档里已经规定的***实践和关于framework设计的内部标准。它应该命名为为TryFindHeader或者如果没有找到匹配的消息头就应该抛出一个异常。抛开我的看法,当调用FindHeader方法的时候,我们必须检查返回的值是否为-1。

在找到消息头块的索引以后(只要不是-1),我们随后就可以检查消息头块的值。为此,我们调用其中一个GetHeader<T> 方法。重载的方法接受各种参数,包括一个消息头块的索引和一个自定义的序列化器。其中三个重载方法接受的String参数可以映射到FindHeader方法接受的参数上。内部来看,这些重载方法调用适当的FindHeader方法,并且检查返回的值是否是-1.与FindHeader相反,如果没有找到匹配的消息头块,GetHeader<T>方法会抛出个异常。

责任编辑:曹凯 来源: CSDN
相关推荐

2010-02-25 10:52:29

WCF响应服务

2010-03-01 15:40:04

WCF实例停用

2010-02-25 18:04:02

WCF IIS宿主

2010-03-01 09:48:23

WCF会话服务

2010-03-01 16:04:31

WCF服务契约

2010-03-01 18:11:40

WCF数据契约变更

2010-03-01 11:24:31

WCF面向服务

2010-02-23 15:58:57

WCF Session

2010-02-22 16:19:25

WCF自托管

2010-03-04 14:57:08

Python解密VBS

2009-12-21 14:49:27

2010-02-22 17:21:02

WCF消息交换

2010-02-25 09:50:30

WCF路由截获消息

2009-11-23 11:03:12

php_curl库

2010-01-25 13:45:04

Android单选框

2010-02-23 14:17:20

WCF配置文件

2010-02-06 16:16:01

C++冒泡排序

2013-12-12 16:10:21

Lua脚本语言

2010-02-25 16:45:13

WCF应用技巧

2010-03-02 10:54:42

WCF回调操作
点赞
收藏

51CTO技术栈公众号