【问题标题】:WCF & Enterprise Library - Exception Shielding and Validation Application BlockWCF & Enterprise Library - 异常屏蔽和验证应用程序块
【发布时间】:2011-12-31 12:09:47
【问题描述】:

我有一个 WCF 服务,它使用企业库进行异常处理和 WCF 验证集成。他们似乎没有一起工作。

我想要的是:

  1. 如果我的服务抛出任何类型的异常,WCF Exception Shielding 将捕获并抛出 FaultException<MyServiceFault>
  2. 如果传入消息验证失败,服务应继续抛出FaultException<ValidationFault>

但是,我不知道如何告诉异常屏蔽政策让验证异常通过。

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

Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.FaultContractWrapperException

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

是否可以使用 WCF 异常屏蔽来捕获除 WCF 验证异常之外的所有异常?如果没有,我将不得不为可能引发的所有不同异常添加更多配置 - 在这种情况下,异常屏蔽的意义何在?

【问题讨论】:

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


    【解决方案1】:

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

    Refer to this link to add vote to this bug.

    【讨论】:

    • 虽然“WCF Exception Shielding”之外的任何东西都会导致一切都失败,但我am使用此策略名称。我的答案中的配置确实有效!
    【解决方案2】:

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

    <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&lt;MyServiceFault&gt; 抛出,除非 WCF 验证应用程序块抛出异常,然后一切正常,客户端会收到 FaultException&lt;ValidationFault&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多