(转)使用自定义行为扩展 WCF
代码下载位置: ServiceStation2007_12.exe (165 KB)
Browse the Code Online
调度程序/代理扩展
实现自定义扩展
参数检查器
消息检查器
操作调用程序
使用行为应用自定义扩展
将行为添加到运行时
添加具有属性和配置的行为
行为验证和绑定配置
在扩展之间共享状态
总结
阶段 | 侦听器接口 | 说明 |
---|---|---|
参数检查 | IParameterInspector | 在调用前后调用,以检查和修改参数值。 |
消息格式化 | IDispatchMessageFormatter IClientFormatter | 调用以执行序列化和反序列化。 |
消息检查 | IDispatchMessageInspector IClientMessageInspector | 发送前或收到后调用,以检查和替换消息内容。 |
操作选择 | IDispatchOperationSelector IClientOperationSelector | 调用以选择要为给定的消息调用的操作。 |
操作调用程序 | IOperationInvoker | 调用以调用操作 |
复制代码
[ServiceContract] public interface IZipCodeService {[OperationContract]string Lookup(string zipcode); }
复制代码
public class ZipCodeInspector : IParameterInspector {int zipCodeParamIndex;string zipCodeFormat = @"\d{5}-\d{4}";public ZipCodeInspector() : this(0) { }public ZipCodeInspector(int zipCodeParamIndex){this.zipCodeParamIndex = zipCodeParamIndex;}... // AfterCall is emptypublic object BeforeCall(string operationName, object[] inputs){string zipCodeParam = inputs[this.zipCodeParamIndex] as string;if (!Regex.IsMatch(zipCodeParam, this.zipCodeFormat, RegexOptions.None))throw new FaultException("Invalid zip code format. Required format: #####-####");return null;} }
复制代码
public class ConsoleMessageTracer : IDispatchMessageInspector, IClientMessageInspector {private Message TraceMessage(MessageBuffer buffer){Message msg = buffer.CreateMessage();Console.WriteLine("\n{0}\n", msg);return buffer.CreateMessage();}public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext){request = TraceMessage(request.CreateBufferedCopy(int.MaxValue));return null;}public void BeforeSendReply(ref Message reply, objectcorrelationState){reply = TraceMessage(reply.CreateBufferedCopy(int.MaxValue));}public void AfterReceiveReply(ref Message reply, objectcorrelationState){reply = TraceMessage(reply.CreateBufferedCopy(int.MaxValue));}public object BeforeSendRequest(ref Message request, IClientChannel channel){request = TraceMessage(request.CreateBufferedCopy(int.MaxValue));return null;} }
复制代码
public class ZipCodeCacher : IOperationInvoker {IOperationInvoker innerOperationInvoker;Dictionary<string, string> zipCodeCache = new Dictionary<string, string>();public ZipCodeCacher(IOperationInvoker innerOperationInvoker){this.innerOperationInvoker = innerOperationInvoker;}public object Invoke(object instance, object[] inputs, out object[] outputs){string zipcode = inputs[0] as string;string value;if (this.zipCodeCache.TryGetValue(zipcode, out value)){outputs = new object[0];return value;}else{value = (string)this.innerOperationInvoker.Invoke(instance, inputs, out outputs);zipCodeCache[zipcode] = value;return value;}}... // remaining methods elided// they simply delegate to innerOperationInvoker }
方法 | 说明 |
---|---|
验证 | 仅在构建运行时前调用 — 允许您对服务说明执行自定义验证。 |
AddBindingParameters | 在构建运行时的第一步时,且在构造底层通道前调用 — 允许添加参数,以影响底层通道堆栈。 |
ApplyClientBehavior | 允许行为插入代理(客户端)扩展。请注意,IServiceBehavior 中不存在该方法。 |
ApplyDispatchBehavior | 允许行为插入调度程序扩展。 |
作用域 | 接口 | 潜在影响 | |||
服务 | 终结点 | 约定 | 操作 | ||
服务 | IServiceBehavior | ✗ | ✗ | ✗ | ✗ |
终结点 | IEndpointBehavior | ✗ | ✗ | ✗ | |
约定 | IContractBehavior | ✗ | ✗ | ||
操作 | IOperationBehavior | ✗ |
复制代码
public class ZipCodeValidation : Attribute, IOperationBehavior {public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation){ZipCodeInspector zipCodeInspector = new ZipCodeInspector();clientOperation.ParameterInspectors.Add(zipCodeInspector);}public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation){ZipCodeInspector zipCodeInspector = new ZipCodeInspector();dispatchOperation.ParameterInspectors.Add(zipCodeInspector);}... // remaining methods empty }public class ZipCodeCaching : Attribute, IOperationBehavior {public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation){dispatchOperation.Invoker = new ZipCodeCacher(dispatchOperation.Invoker);}... // remaining methods empty }
复制代码
public class ConsoleMessageTracing : Attribute, IEndpointBehavior, IServiceBehavior {void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime){clientRuntime.MessageInspectors.Add(new ConsoleMessageTracer());}void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher){endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new ConsoleMessageTracer());}... // remaining methods emptyvoid IServiceBehavior.ApplyDispatchBehavior(ServiceDescription desc, ServiceHostBase host){foreach (ChannelDispatcher cDispatcher in host.ChannelDispatchers)foreach (EndpointDispatcher eDispatcher in cDispatcher.Endpoints)eDispatcher.DispatchRuntime.MessageInspectors.Add(new ConsoleMessageTracer());}... // remaining methods empty }
复制代码
ServiceHost host = new ServiceHost(typeof(ZipCodeService)); host.Description.Behaviors.Add(new ConsoleMessageTracing());
复制代码
ServiceHost host = new ServiceHost(typeof(ZipCodeService)); foreach (ServiceEndpoint se in host.Description.Endpoints)se.Behaviors.Add(new ConsoleMessageTracing());
复制代码
ZipCodeServiceClient client = new ZipCodeServiceClient(); client.ChannelFactory.Endpoint.Behaviors.Add(new ConsoleMessageTracing());
复制代码
[ServiceContract] public interface IZipCodeService {[ZipCodeCaching][ZipCodeValidation][OperationContract]string Lookup(string zipcode); }[ConsoleMessageTracing] public class ZipCodeService : IZipCodeService {... }
复制代码
public class ConsoleMessageTracingElement : BehaviorExtensionElement {public override Type BehaviorType{get { return typeof(ConsoleMessageTracing); }}protected override object CreateBehavior(){return new ConsoleMessageTracing();} }
复制代码
<configuration><system.serviceModel><services><service name="ZipCodeServiceLibrary.ZipCodeService" behaviorConfiguration="Default"><endpoint binding="basicHttpBinding" contract="ZipCodeServiceLibrary.IZipCodeService"/></service></services><behaviors><serviceBehaviors><behavior name="Default"><serviceMetadata httpGetEnabled="true"/><consoleMessageTracing/></behavior></serviceBehaviors></behaviors><extensions><behaviorExtensions><add name="consoleMessageTracing" type="Extensions.ConsoleMessageTracingElement, Extensions, Version=1.0.0.0,Culture=neutral, PublicKeyToken=null"/></behaviorExtensions></extensions></system.serviceModel> </configuration>
行为类型 | 配置选项 | ||
属性 | 配置 | 显式 | |
服务 | ✗ | ✗ | ✗ |
终结点 | ✗ | ✗ | |
约定 | ✗ | ✗ | |
操作 | ✗ | ✗ |
复制代码
public class NoBasicEndpointValidator : Attribute, IServiceBehavior {#region IServiceBehavior Memberspublic void Validate(ServiceDescription desc, ServiceHostBase host){foreach (ServiceEndpoint se in desc.Endpoints)if (se.Binding.Name.Equals("BasicHttpBinding"))throw new FaultException("BasicHttpBinding is not allowed");}... //remaining methods empty }
转载于:https://www.cnblogs.com/syf/archive/2012/04/18/2455309.html
(转)使用自定义行为扩展 WCF相关推荐
- 使用自定义行为扩展 WCF
Windows® Communication Foundation (WCF) 提供了许多扩展点,供开发人员自定义运行时行为,从而实现服务调度和客户代理调用.您可以通过编写能以声明方式应用到服务中的自 ...
- OpenCASCADE绘制测试线束:使用自定义命令扩展测试工具
OpenCASCADE: 使用自定义命令扩展测试工具 自定义命令实现 在测试工具中注册命令 创建工具包(库)作为插件 创建插件资源文件 动态加载和激活 使用自定义命令扩展测试工具 以下章节解释了如何使 ...
- 通过自定义资源扩展Kubernetes
原文链接:通过自定义资源扩展Kubernetes 转载于:https://www.cnblogs.com/wangjq19920210/p/11555996.html
- 扩展WCF的消息分发行为
使用消息分发检查器IDispatchMessageInspector.服务器行为IServiceBehavior.端点行为IEndpointBehavior扩展WCF的消息分发行为 Extend WC ...
- WPF - 自定义标记扩展
在使用WPF进行编程的过程中,我们常常需要使用XAML的标记扩展:{Binding},{x:Null}等等.那么为什么WPF提供了XAML标记扩展这一功能,我们又如何创建自定义的标记扩展呢.这就是本文 ...
- 自定义托管宿主WCF解决方案开发配置过程详解
上一节<WCF分布式框架基础概念>我们介绍了WCF服务的概念和通信框架模型,并给出了基于自定义托管服务的WCF程序的实现代码.考虑到WCF分布式开发项目中关于托管宿主服务配置和客户端添加引 ...
- (转)Bootstrap 之 Metronic 模板的学习之路 - (6)自定义和扩展
https://segmentfault.com/a/1190000006815041 前面我们将 Metronic 的结构和源码大致浏览了一遍,Metronic 整个文件包有三百多兆,在实际项目中, ...
- Visual Studio和VS Code自定义文件扩展名映射
Visual Studio和VS Code自定义文件扩展名映射 自定义文件扩展名映射可以让Visual Studio和VS Code将一种扩展名识别为另一种扩展名,以便增加对原扩展名文件的语法高亮和智 ...
- 通过WCF Extension定制扩展WCF行为
功能介绍 当我们需要扩展WCF的功能,或者需要实现某些特定的功能,我们必须应用WCF的扩展定制功能(WCF extension),WCF framework提供了丰富的可扩展性,其提供的可扩展接口如下 ...
最新文章
- 程序在内存中运行的奥秘
- 海康摄像头的二次开发(java)
- 项目四-用循环求(1)
- python 倒计时_用Python帮你远离猝死悲剧
- 输入两个整数a和b,计算a+b的和
- ASP.NET多种不同页面间数据传递的方法
- fastdfs-客户端配置
- 【python教程入门学习】学python要多久,0基础学python有多难
- NuGet程序包安装SQLite后完全抽离出SQLite之入门介绍及注意事项,你真的懂了吗?...
- WebBrowser控件使用相关
- Url ReWriting
- scala implicit隐式转化与隐式参数
- Charles抓包工具的破解以及使用
- ros2之tello无人机
- 私有化部署的知识文档系统,不再担心文档数据泄漏
- python实现归结演绎推理_人工智能——归结演绎推理
- top1-Accuracy,top5-Accuracy举例精析
- 第1章 数学基础和机器学习问题(范数+矩阵迹+矩阵求导+机器学习框架)
- 关于系统安装之U盘制作【install.wim】
- Python海龟turtle画椭圆方法