行为是WCF影响运行时操作的类。行为作为WCF运行时被调用,在客户端和服务端运行并作为消息在两者之间流转。因为行为运行在这些重要的时间,它们被用来实现很多WCF的内建特性。它们也是一个重要的自定义扩展点。
例如,ServiceHost用来定义一个服务端的实例和并发方面,另外也分发消息给适当的操作。当一条消息被一个服务接收到并分发给一个类的 特定方法时,ServiceHost应该为每次请求创建一个类的实例还是重用实例?但ServiceHost调用类的方法时,它需要加入到一个事务的列表 中吗?这些都在行为中定义并且在初始化中使用。
行为有三种初始类型。服务行为运行在服务端并能访问所有终结点。它们控制一些诸如实例和事务的组件。服务行为在认证和审计中也有。终结点行为的 使用范围是服务终结点。这些对检测消息以及处理服务端接收/发送消息非常适用。操作行为的作用范围是操作层次并且对一个服务操作的操作序列化,事务流和参 数处理非常适合。除了这三个,WCF也定义了回调行为,与服务行为类似,但是控制双工通信中在客户端的终结点的创建。
为了理解行为是如何使用的,有必要考虑运行时是如何初始化的。这是通过在客户端的ChannelFactory和在服务端的ServiceHost.这两个类都执行了类似的功能:
1. 接收一个.NET类型作为输入而且读取它的属性信息。
2. 从app.config 或者web.config 文件载入配置信息。在客户端,ChannelFactory主要查看绑定信息;在服务端,ServiceHost主要查看契约和绑定信息。
3. 创建运行时环境结构,ServiceDescription.
4. 开始通信。在客户端,ChannelFactory使用信道链接服务端;在服务端,ServiceHost打开信道并监听消息。
在步骤1,行为信息在代码中以属性形式定义,如[ServiceBehavior(TransactionTimeout="00:00:30")]. 在步骤2,行为信息在配置文件中定义,如一个app.config文件中的<transactionTimeout="00:00:30"& gt;.在步骤3,ChannelFactory和ServiceHost类创建WCF运行时而且负责将步骤1和步骤2中找到的行为插入到运行时。也是在 第3步,行为可以手动添加到服务模型,如Endpoint.Behaviors.Add(new MyBehavior());
除了初始化,行为也可以在数据发送前或接收到以后操作数据。在客户端,行为可以用来执行三个函数:
1. 参数检测。检测并/或改变数据的.NET表现形式,在数据被转换成XML前。
2. 格式化消息。检测并/或改变数据当数据在.NET类型和XML间转换时。
3. 消息检测。在数据被转成.NET类型前,检测并/或改变数据的XML表现形式。
在服务端,行为可以用在两个额外的场景中:
操作选择。在服务端,检测接收到的消息并确定应该调用哪个服务。
操作调用。在操作层,调用类的方法。
图片5.1 描述了当消息在客户端和服务端之间发送时行为元素间的控制流调用。当客户端的应用代码调用GetPrice(...),参数检测器和消息格式化器被调用并 传递.NET格式的参数。然后,也是在客户端,消息检测器被调用并传递XML消息。在服务端,当消息到达信道,消息检测器和操作选择器被调用并检测和确认 哪一个操作应该接收消息。消息编码器然后被调用消息转换成.NET类型,参数检测器被调用并在.NET表示中传递消息。最后,操作调用器被用来调用目标类 的方法,同时做任何设置和拆卸.
正如你在图片5.1中看的那样,有很多截取点存在以便于行为可以监控并修改消息流。它们也在合适的位置来影响一个服务的整体性能表现。
===========
转载自