WCF&企业库 - 异常屏蔽和验证应用程序块

时间:2011-11-17 16:08:33

标签: wcf enterprise-library enterprise-library-5

我有一个WCF服务,它使用Enterprise Library进行异常处理和WCF验证集成。他们似乎没有合作。

我想要的是:

  1. 如果我的服务抛出任何类型的异常,WCF Exception Shielding将捕获此异常并抛出FaultException<MyServiceFault>
  2. 如果传入消息未通过验证,则服务应继续抛出FaultException<ValidationFault>
  3. 但是,我不知道如何告诉异常屏蔽策略让验证异常通过。

    我有一些Enterprise Library配置,可以将每个例外转换为FaultException<MyServiceFault>。如果我让EnterpriseLibrary记录它捕获的异常,它会说它得到了

      

    Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.FaultContractWrapperException

    验证失败时

    但是,如果将此异常作为<exceptionType> postHandlingAction None的新FaultException<MyServiceFault>添加到配置中,则在验证失败时仍然会抛出{{1}}。

    是否可以使用WCF异常屏蔽来捕获除WCF验证异常之外的每个异常?如果没有,我将不得不为可能抛出的所有不同异常添加更多的配置 - 在这种情况下异常屏蔽的重点是什么?

2 个答案:

答案 0 :(得分:0)

嗯,虽然我以为我已经尝试过这个,但是以下配置似乎可以完成这项工作:

<add name="WCF Exception Shielding">
    <exceptionTypes>
        <add name="FaultException`1" type="System.ServiceModel.FaultException`1[[Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.ValidationFault, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]], System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
            postHandlingAction="NotifyRethrow" />
        <add name="All Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
            postHandlingAction="ThrowNewException">
            <exceptionHandlers>
                <add type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.FaultContractExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                    faultContractType="MyServiceFault, MyServices"
                    name="Fault Contract Exception Handler" />
            </exceptionHandlers>
        </add>
    </exceptionTypes>
</add>

在服务代码中抛出任何异常,它被抛出为FaultException<MyServiceFault>,除非WCF验证应用程序块抛出异常,然后一切正常,客户端收到FaultException<ValidationFault>

答案 1 :(得分:0)

库中存在一个错误,可能会阻止您提供的解决方案正常运行。解决方法是不更改异常屏蔽块的默认策略名称。

Refer to this link to add vote to this bug.