知识手册之谈WCF行为扩展

开发 后端
在WCF行为扩展是很常用的,对DispatchRuntime和DispatchOperation进行扩展,扩展点包括了对参数和消息的检查,以及操作调用程序。

WCF行为扩展有很多值得学习的地方,大家可以上网收收资料了解一下,本人比较热爱WCF这门技术,我先给大家总结点关于WCF行为扩展的知识。WCF以其灵活的可扩展架构为开发者提供了方便,其中WCF行为扩展或许是应用中最为常见的。自定义对行为的扩展并不复杂,但仍有许多细节需要注意。

#T#在服务端,一般是对DispatchRuntime和DispatchOperation进行扩展,扩展点包括了对参数和消息的检查,以及操作调用程序,它们对应的接口分别为IParameterInspector,IDispatchMessageInspector以及 IOperationInvoker。而在客户端,则是对ClientRuntime和ClientOperation进行扩展,扩展点包括对参数和消息的检查,对应的接口分别为IParameterInspector和IClientMessageInspector。这些接口类型均被定义在 System.ServiceModel.Dispatcher命名空间下,其中IParameterInspector接口可以同时作用在服务端和客户端。

对这些接口的实现,有点类似于AOP的实现,可以对方法调用前和调用后注入一些额外的逻辑,所以通常会将这些扩展称为侦听器。例如IParameterInspector接口,就定义了如下方法:

  1. void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState);  
  2. object BeforeCall(string operationName, object[] inputs); 

在调用服务对象的目标方法前,会调用BeforeCall方法,而在调用后则会调用AfterCall方法。例如我们可在方法调用前检验计算方法的参数是否小于0,如果小于0则抛出异常:

  1. public class CalculatorParameterInspector:IParameterInspector  
  2. {  
  3. public void BeforeCall(string operationName, object[] inputs)  
  4. {  
  5. int x = inputs[0] as int;  
  6. int y = inputs[1] as int;  
  7. if (x <0 || y < 0)  
  8. {  
  9. throw new FaultException("The number can not be less than zero.");  
  10. }  
  11. return null;  
  12. }  
  13. public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)  
  14. {  
  15. //empty;  
  16. }  

对消息的检查区分了服务端和客户端,接口方法根据消息传递的顺序刚好相反[注]。我们可以通过接口方法对消息进行处理,例如打印消息的Header:

  1. public class PrintMessageInterceptor : IDispatchMessageInspector  
  2. {  
  3. #region IDispatchMessageInspector Members  
  4.  
  5. public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)  
  6. {  
  7. MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);  
  8. request = buffer.CreateMessage();  
  9.  
  10. Console.WriteLine("After Receive Request:");  
  11. foreach (MessageHeader header in request.Headers)  
  12. {  
  13. Console.WriteLine(header);  
  14. }  
  15. Console.WriteLine(new string('*', 20));  
  16. return null;  
  17. }  
  18.  
  19. public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)  
  20. {  
  21. MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);  
  22. reply = buffer.CreateMessage();  
  23.  
  24. Console.WriteLine("Before Send Request:");  
  25. foreach (MessageHeader header in reply.Headers)  
  26. {  
  27. Console.WriteLine(header);  
  28. }  
  29. Console.WriteLine(new string('*', 20));  
  30. }  
  31.  
  32. #endregion  
责任编辑:田树 来源: 博客
相关推荐

2009-03-16 09:16:13

行为扩展WCF.NET

2010-02-26 10:46:12

WCF行为扩展

2009-11-09 17:06:38

WCF选择绑定

2010-03-02 17:48:35

WCF寻址报头

2010-03-01 14:41:14

WCF行为扩展

2009-11-05 15:50:25

WCF behavio

2009-12-21 10:44:32

2009-12-22 11:14:38

WCF禁用安全配置

2010-03-01 14:50:30

WCF行为类型

2010-02-25 09:36:28

WCF行为控制

2009-12-22 14:54:52

WCF安全

2010-03-02 09:24:22

WCF变更行为

2010-03-02 14:41:00

WCF行为控制

2009-11-06 14:25:56

WCF接口

2009-12-22 14:16:01

WCF连接服务超时

2009-12-22 15:33:50

WCF传输安全

2010-03-01 09:19:10

WCF编码规范

2009-11-05 15:18:19

WCF扩展

2010-03-30 08:40:36

WCF

2010-02-25 17:22:39

WCF服务行为
点赞
收藏

51CTO技术栈公众号