欢迎来到天天文库
浏览记录
ID:14501149
大小:36.50 KB
页数:3页
时间:2018-07-29
《知识手册之谈wcf行为扩展》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、知识手册之谈WCF行为扩展WCF行为扩展有很多值得学习的地方,大家可以上网收收资料了解一下,本人比较热爱WCF这门技术,我先给大家总结点关于WCF行为扩展的知识。WCF以其灵活的可扩展架构为开发者提供了方便,其中WCF行为扩展或许是应用中最为常见的。自定义对行为的扩展并不复杂,但仍有许多细节需要注意。在服务端,一般是对DispatchRuntime和DispatchOperation进行扩展,扩展点包括了对参数和消息的检查,以及操作调用程序,它们对应的接口分别为IParameterInspector,IDispatchMessageInspector以及IOperationIn
2、voker。而在客户端,则是对ClientRuntime和ClientOperation进行扩展,扩展点包括对参数和消息的检查,对应的接口分别为IParameterInspector和IClientMessageInspector。这些接口类型均被定义在System.ServiceModel.Dispatcher命名空间下,其中IParameterInspector接口可以同时作用在服务端和客户端。对这些接口的实现,有点类似于AOP的实现,可以对方法调用前和调用后注入一些额外的逻辑,所以通常会将这些扩展称为侦听器。例如IParameterInspector接口,就定义了如下方法
3、:1.void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState); 2.object BeforeCall(string operationName, object[] inputs); 在调用服务对象的目标方法前,会调用BeforeCall方法,而在调用后则会调用AfterCall方法。例如我们可在方法调用前检验计算方法的参数是否小于0,如果小于0则抛出异常:3.public class CalculatorParameterInspec
4、tor:IParameterInspector 4.{ 5.public void BeforeCall(string operationName, object[] inputs) 6.{ 7.int x = inputs[0] as int; 8.int y = inputs[1] as int; 9.if (x <0
5、
6、 y < 0) 10.{ 11.throw new FaultException("The number can not be less than zero."); 12.} 13.return null; 14.} 1.public void Afte
7、rCall(string operationName, object[] outputs, object returnValue, object correlationState) 2.{ 3.//empty; 4.} 5.} 对消息的检查区分了服务端和客户端,接口方法根据消息传递的顺序刚好相反[注]。我们可以通过接口方法对消息进行处理,例如打印消息的Header:6.public class PrintMessageInterceptor : IDispatchMessageInspector 7.{ 8.#region IDispatchMessageInspector M
8、embers 9. 10.public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 11.{ 12.MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 13.request = buffer.CreateMessage(); 14. 15.Console.WriteLine("
9、After Receive Request:"); 16.foreach (MessageHeader header in request.Headers) 17.{ 18.Console.WriteLine(header); 19.} 20.Console.WriteLine(new string('*', 20)); 21.return null; 22.} 23. 24.public void BeforeSendReply(ref System.ServiceModel.Channe
此文档下载收益归作者所有