在Windows Communication Foundation (WCF)中,为了阻止服务的实现细节从服务的安全边界泄露,未知的异常不应该被发送至客服端。在WCF配置中将<serviceDebug>配置节的includeExceptionDetailInFaults属性的值显式设置为false后(或干脆不设置,因为False是默认值),即可达到此目的。

备注:

includeExceptionDetailInFaults配置只用于未知的或未被处理的异常。对已知的异常(标有FaultContract特性的operation在其实现中抛出的FaultException<knownFault>类型的异常)无效。

“异常保护”用于当一个异常被抛出时阻止其服务的内部实现信息的泄露。以下是使用“异常保护”的理由:

  • 异常的细节中所包含的信息可能会被黑客利用来挖掘系统的资源。
  • 一些预期的异常信息需要被返回给客户端。
  • 在一个Web服务中发生的异常应该被记录下来,以帮助故障诊断。

只有那些被处理过的在设计中被设定为安全的异常才应该被返回至客户端。在设计中被设定为安全的异常在其message中不包含一些敏感信息,也不包含具体的stack trace,因为它们可能会泄露Web服务内部的实现信息。你应该使用“异常保护”模式,将不安全的异常处理成安全的异常。

异常处理应用块(Exception Handling Application Block)包含在WCF服务边界上对“异常保护”的支持。这包含以下部分:

  • “异常保护特性(Exception Shielding Attribute)”,用来将一个在异常处理应用块中配置的命名的异常处理策略关联至一个WCF服务操作(operation)。
  • “错误契约异常处理器(Fault Contract Exception Handler)”,用来将一个异常转化为一个指定类型的错误契约(Fault Contract)并映射相应的属性。

使用异常保护特性(Exception Shielding Attribute)

为一个WCF服务中增加异常保护功能

  1. 加入以下程序集:

    • Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll
    • Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.dll
    • Microsoft.Practices.EnterpriseLibrary.Common.dll
    • Microsoft.Practices.Unity.dll
    • Microsoft.Practices.Unity.Interception.dll
    • Microsoft.Practices.ServiceLocation.dll
  2. 使用using (C#) 或 Imports (Visual Basic) 语句引入命名空间Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF
  3. 为服务实现类或服务契约接口增加“ExceptionShielding”特性,同时指定异常处理策略名作为其构造方法的参数。若不指定异常处理策略名,或其指定的策略未在配置中定义,则默认查找名字为“WCF Exception Shielding”的策略进行处理。
  4. 在服务的Web.config文件中增加异常处理应用块的配置节,然后在其中定义所需要的异常处理策略与异常处理器。“错误契约异常处理器”(在下面的章节中有描述)用来将异常映射至为操作契约(operation contract)定义的错误契约。
  5. 在服务的客户端实现异常处理逻辑,以捕获服务可能抛出的异常并将它们发送至异常处理应用块。

以下的代码指定了一个服务契约,其中包括一个可能抛出名为SystemUnavailableFault 错误契约的GetQuote操作(operation)。ExceptionShielding特性被应用至服务实现类(QuoteService类),通过构造方法的参数指定当异常发生时执行名为QuoteServicePolicy的异常处理策略。

 

 

[ServiceContract]

public interface IQuoteService

{

[OperationContract]

[FaultContract(typeof(FaultContracts.SystemUnavailableFault))]

QuoteResponseType GetQuote(QuoteRequestType request);

}

[ExceptionShielding("QuoteServicePolicy")]

public class QuoteService : IQuoteService

{

public QuoteResponseType GetQuote(QuoteRequestType request)

{

// Method code here...

}

}

 

 

使用错误契约异常处理器

在WCF应用程序中使用异常处理应用块进行异常保护时,你可以使用错误契约异常处理器将一个运行时异常转换为一个合适的错误契约类型。此异常处理器也让你能够将原始异常中的属性与处理实例的ID映射至错误契约中的属性。

为了使用错误契约异常处理器

  1. 创建一个异常处理策略,其中包含对你的应用程序来说合适的异常类型。
  2. 配置异常类型,将ThrowNewException指定为其处理后行为(post-handling action)。这意味着处理块将在整条处理器链运行完毕后抛出新的异常(包装了原始异常)。
  3. 为指定的异常类型增加一个新的错误契约异常处理器。
  4. 配置错误契约异常处理器:
    • 指定应该要被返回至客户端的错误契约类型。
    • 增加要被返回至客户端的错误契约使用的异常信息。
    • 此步可选。配置属性从原始异常至目标错误契约的映射方式。在处理器配置的Property Mappings节中映射每一个你想映射的属性。映射的“Name”属性用于指定错误契约中的属性名,“Source”属性用于指定原始异常。你也可能使用{HandlingInstanceId}以将当前的处理实例的ID指定至错误契约属性。

错误契约异常处理器将自动映射原始异常中所有名字匹配且类型兼容的属性至目标错误异常。若你不想这样,你可以指定一条映射,将其“Name”属性值设为目标错误契约的属性名,并将其“Source”属性值设为空字符串。

【译】使用微软企业库5.0进行WCF服务边界上的异常保护的更多相关文章

  1. [EntLib]微软企业库5.0 学习之路——第一步、基本入门

    话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...

  2. 微软企业库5.0 学习之路——第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息

    在介绍完企业库几个常用模块后,我今天要对企业库的配置文件进行处理,缘由是我打开web.config想进行一些配置的时候发现web.config已经变的异常的臃肿(大量的企业库配置信息充斥其中),所以决 ...

  3. 微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇

    在上一篇文章中, 我介绍了企业库Cryptographer模块的一些重要类,同时介绍了企业库Cryptographer模块为我们提供的扩展接口,今天我就要根据这些 接口来进行扩展开发,实现2个加密解密 ...

  4. 微软企业库5.0 学习之路——第六步、使用Validation模块进行服务器端数据验证

    前端时间花了1个多星期的时间写了使用jQuery.Validate进行客户端验证,但是那仅仅是客户端的验证,在开发项目的过程中,客户端的信息永远是不可信的,所以我们还需要在服务器端进行服务器端的验证已 ...

  5. 微软企业库5.0 学习之路——第四步、使用缓存提高网站的性能(EntLib Caching)

    首先先补习下企业库的Caching Application Block的相关知识: 1.四大缓存方式,在Caching Application Block中,主要提供以下四种保存缓存数据的途径,分别是 ...

  6. 微软企业库5.0 学习之路——第二步、使用VS2010+Data Access模块建立多数据库项目

    现在我就开始进入学习之路的第二步——Data Access模块,这个模块是企业库中被使用频率最高的模块,它很好的封装了数据库操作应用,为我们进行多数据库系统开发提供了便利,只需更改配置文件就 可以很快 ...

  7. 权限管理系统源码分析(ASP.NET MVC 4.0 + easyui + EF6.0 + MYSQL/MSSQLSERVER +微软企业库5.0+日志绶存)

    系统采用最先进技术开发: (ASP.NET MVC 4.0 + easyui + EF6.0 + MYSQL/MSSQLSERVER +微软企业库5.0+日志绶存) 大家可以加我QQ讨论 309159 ...

  8. 使用微软企业库5.0提供的unity配置解藕系统demo(源码)

    最近公司集50多号开发人员的人力围绕一个系统做开发,框架是免不了要统一的,公司提供的架构,利于分工合作,便于维护,扩展,升级,其中使用了到微软的企业库来解藕系统,只是因为框架封装,于是在网上学习了一个 ...

  9. 微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇

    一.独立验证器 我上篇中我将AndCompositeValidator和OrCompositeValidator归为独立验证器,这2个验证器主要是为了第一类验证服务,可以进行多种验证组合在一起进行复杂 ...

随机推荐

  1. 查看进程所用的内存(使用GetWindowThreadProcessId取得进程ID,OpenProcess打开进程和GetProcessMemoryInfo取得内存信息)

    // function GetProcessMemorySize(_sProcessName: string; var _nMemSize: Cardinal): Boolean; var l_nWn ...

  2. Mac OS提示# 14:自己定义文件图标

    本教程的其余部分再一次错过了方法,和一些使用提示,做一些额外的,我们希望对大家有帮助.  自己定义图标      对于Mac OSX用户来说,Dashboard,Dock栏,壁纸以及各种键盘触摸板的快 ...

  3. hdu1171(DP求两份物品的价值相差最小)

    题目信息: 给出一些物品的价值和个数.分成两份,是这两份的价值相差最小(DP方法) http://acm.hdu.edu.cn/showproblem.php? pid=1171 AC代码: /** ...

  4. Java原型模式之基础

    一.是什么? 定义:用原型实例指定创建对象的种类,而且通过拷贝这些原型创建新的对象.(官方定义) 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype. Prototype类须要 ...

  5. ThinkPHP分页使用例子(二十一)

    原文:ThinkPHP分页使用例子(二十一) ThinkPHP分页使用 PHP代码: public function fenye(){ $User = M('Leyangjun'); // 实例化Us ...

  6. 用VBA宏从一个工作薄复制内容到另一个工作薄

    我们项目管理有两个工作薄,一个里面有多个表,每天建一个,记录当天项目,另一个工作薄,有多个表,其中一个是所有项目汇总. 以前都是第一个工作薄一个表做完,再复制粘贴到第二个工作薄的汇总表中. 写了个VB ...

  7. mysql 高可用方案MHA介绍

    概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10—30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新 ...

  8. 多项式相乘(C语言)

    //两个多项式的系数f分别存在x[]和y[]中,下标即为次数,*Max表示本多项式最高次数 int MX_double( double x[], int xMax, double y[], int y ...

  9. C语言内存对齐

    转:http://blog.csdn.net/embeddedman/article/details/7429976 首先由一个程序引入话题:  1 //环境:vc6 + windows sp2 2  ...

  10. [置顶] Guava学习之Immutable集合

    Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...