基于CallContextInitializer的WCF扩展导致的严重问题

WCF是一个具有极高扩展度的分布式通信框架,无论是在信道层(Channel Layer)还是服务模型层(Service Model),我们都可以自定义相关组件通过相应的扩展注入到WCF运行环境中。在WCF众多可扩展点中,ICallContextInitializer可以帮助我们在服务操作执行前后完成一些额外的功能,这实际上就是一种AOP的实现方式。比如在《通过WCF Extension实现Localization》中,我通过ICallContextInitializer确保了服务操作具有和客户端一样的语言文化;在《通过WCF Extension实现Context信息的传递》中,我通过ICallContextInitializer实现上下文在客户端到服务端的自动传递。ICallContextInitializer的定义如下:

1: public interface ICallContextInitializer
2: {
3:   // Methods
4:   void AfterInvoke(object correlationState);
5:   object BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message message);
6: }

昨天,李永京同学问了我一个相关的问题。问题大概是这样的,他采用ICallContextInitializer实现WCF与NHibernate的集成。具体来说是通过ICallContextInitializer实现对事务 的提交,即通过BeforeInvoke方法初始化NHibernate的Session,通过AfterInvoke提交事务。但是,这中间具有一个挺严重的问题:当执行AfterInvoke提交事务的时候,是可能抛出异常的。一旦异常从AfterInvoke抛出,整个服务端都将崩溃。我们现在就来讨论一下这个问题,以及问题产生的根源。

一、问题重现

为了重现这个问题,我写了一个很简单的例子,你可以从这里下载该例子。首先我定义了如下一个实现了ICallContextInitializer接口的自定义CallContextInitializer:MyCallContextInitializer。在AfterInvoke方法中,我直接抛出一个异常。

1: public class MyCallContextInitializer : ICallContextInitializer
2: {
3:   public void AfterInvoke(object correlationState)
4:   {
5:     throw new Exception("调用MyCallContextInitializer.AfterInvoke()出错!");
6:   }
7:
8:   public object BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message message)
9:   {
10:     return null;
11:   }
12: }

然后,我们通过ServiceBehavior的方式来应用上面定义的MyCallContextInitializer。为此,我们定义了如下一个实现了IServiceBehavior接口的服务行为:MyServiceBehaviorAttribute。在ApplyDispatchBehavior方法中,将我们自定义的 MyCallContextInitializer对象添加到所有终结点的分发运行时操作的CallContextInitializer列表中。

1: public class MyServiceBehaviorAttribute : Attribute, IServiceBehavior
2: {
3:   public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
4:
5:   public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
6:   {
7:     foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
8:     {
9:       foreach (EndpointDispatcher endpoint in dispatcher.Endpoints)
10:       {
11:         foreach (DispatchOperation operation in endpoint.DispatchRuntime.Operations)
12:         {
13:           operation.CallContextInitializers.Add(new MyCallContextInitializer());
14:         }
15:       }
16:     }
17:   }
18:
19:   public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
20: }

时间: 2024-11-03 00:03:20

基于CallContextInitializer的WCF扩展导致的严重问题的相关文章

一起谈.NET技术,基于CallContextInitializer的WCF扩展导致的严重问题

WCF是一个具有极高扩展度的分布式通信框架,无论是在信道层(Channel Layer)还是服务模型层(Service Model),我们都可以自定义相关组件通过相应的扩展注入到WCF运行环境中.在WCF众多可扩展点中,ICallContextInitializer可以帮助我们在服务操作执行前后完成一些额外的功能,这实际上就是一种AOP的实现方式.比如在<通过WCF Extension实现Localization>中,我通过ICallContextInitializer确保了服务操作具有和客户

Enterprise Library深入解析与灵活应用(8):通过WCF扩展实现与EHAB的集成[

Enterprise Library深入解析与灵活应用(8):通过WCF扩展实现与EHAB的集成[上篇] 在<WCF技术剖析(卷1)>的最后一章,我给出了一个具体的应用WCF的分布式应用实例,我把这个实例命名为PetShop.在这个例子中,我利用WCF的扩展实 现了一些设计.架构模式,比如AOP.IoC等.看过本书的读者,一定还记得我还 通过WCF扩展实现了于微软企业库(Enterprise Library)异常处理应用块 (Exception Handling Application Blo

基于云计算的电力系统扩展短期负荷预测

基于云计算的电力系统扩展短期负荷预测 王惠中 侯璟琨 赵凯 李春霞 在电力市场环境下,制定和调整当日负荷计划的周期缩短, 尤其是滚动发电计划的提出,使现有负荷预测方法无法满足电力部门对预测精度和速度的要求,因此有人提出了扩展短期负荷预测的概念来解决这一问题,但该方法导致学习机的维数灾难问题难以避免.利用云计算技术对该方法进行改进,在避免了维数灾难的同时提高了预测精度与速度,并用East-Slovakia Power Distribution Company 提供的电网运行数据验证了该方法的有效性

基于WF与WCF构建数据逻辑层

WF是什么,许多对NET技术有了解的人能说出一点,但又说不清楚 不论你认为WF是什么,但不要与Jbpm ,Shark ,Biztalk,SharePoint 这些产品做比效,这些产品有共同的特点就是面向企业业务流程应用的产品,WF不是,WF面向的开发人员 WF是一个使用XML描述,具有IOC.AOP功能的面向流程控制的开发平台. 我从事工作流开发有8年了,学习WF已经有5年了,在博客园写关于WF的主题博客也快4年了,自从接触WF后我一直在解释WF与传统工作流之间的区别 可能是我即从事工作流开发,

Geneva框架:构建基于声明的WCF服务的更好方法

本文基于"Geneva"框架的预发布版本撰写而成.所有信息均有可能发生变更. 本文使用以下技术: Windows Communication Foundation "Geneva"框架(以前称为"Zermatt")是用于构建基于声明的应用程序和服务以及实现联合安全方案的新框架代号.它的功能包括用于构建自定义安全令牌服务 (STS) 的探测功能.要求从 ASP.NET 应用程序进行联合身份验证的机制,以及简化 ASP.NET 应用程序和 Windo

iOS开发封装一个可以响应超链接的label——基于RCLabel的交互扩展

iOS开发封装一个可以响应超链接的label--基于RCLabel的交互扩展 一.引言         iOS系统是一个十分注重用户体验的系统,在iOS系统中,用户交互的方案也十分多,然而要在label中的某部分字体中添加交互行为确实不容易的,如果使用其他类似Button的控件来模拟,文字的排版又将是一个解决十分困难的问题.这个问题的由来是项目中的一个界面中有一些广告位标签,而这些广告位的标签却是嵌在文本中的,当用户点击文字标签的位置时,会跳转到响应的广告页.         CoreText框

flex-oracle序列,循服调用wcf服务导致的的问题问题

问题描述 oracle序列,循服调用wcf服务导致的的问题问题 有个程序是wcf+flex,现在要使用for循环来调用wcf的一个插入服务,要插入的目的表已有个序列了,我发现当我的循环次数越多,调用改服务越频繁后,出现的ORA-00001: 违反唯一约束条件的报错也越来越多. 我想知道这是什么原因,有什么解决办法? 解决方案 在wcf中的接口处使用单例. 解决方案二: ORA-00001: 违反唯一约束条件的报错也越来越多. 这是主键值冲突,每次更新前取一下序列.nextval,然后更新,不会出

通过WCF扩展实现消息压缩

对于需要进行大规模数据传输的WCF应用来说,对于请求消息和回复消息进行传输前的压缩,不但可以降低网络流量,也可以提高网络传输的性能.由于WCF的扩展性,我们可以采用不同的方式实现对消息的压缩,本文提供一种比较简单的实现方式.[源代码从这里下载] 一.三种可行的消息压缩方案 二.DataCompressor--用于数据压缩与解压缩组件 三.MessageCompressor--用于消息压缩与解压的组件 四.CompressionMessageFormatter--用于对请求/回复消息压缩和解压缩的

【HIMI转载推荐之三】基于COCOS2DX引擎UI扩展引擎包[COCOS2D-X-3C]

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/himi-zan/1556.html [前言点评] 此篇主要作者:jason-lee-lijunlin  基于Cocos2d-x引擎进行封装的UI框架的扩展包. 此文章Himi已经仔细看过,总体来说是篇很好的文章,是给使用-x引擎的童鞋们的福利-.真的非常感谢作者的分享,近两年 Himi看到了越来越多的开发者们将自己的作品与劳动成果无私放在网