gpt4 book ai didi

c# - 使用企业库异常 block 的 WCF 异常屏蔽

转载 作者:太空宇宙 更新时间:2023-11-03 20:34:59 26 4
gpt4 key购买 nike

我正在使用企业库根据 Guy Burstein 的博文 here 实现异常屏蔽.我的实现与他的实现基本相同,但是我有几个问题:

1:异常屏蔽的要点是不传递错误的确切细节,那么为什么映射指定传递来自原始异常的消息不变。提供不太具体的消息的明智方式是什么?

2:传回的 faultexception 包含来自原始异常的消息,因此无论我设法在故障契约中包装或返回什么,都可以在 faultexception 上获得详细信息。有没有办法将信息删除回通用的“内部错误”消息。

请注意,如果我不使用 [ExceptionShielding][FaultContract] 属性,则服务会返回标准的“服务器无法处理请求,因为到内部错误”消息。

最佳答案

如果您知道自己的应用程序异常不会泄露敏感信息,您可以处理这些特定异常并映射消息属性。对于其他异常(exception)情况,您可以跳过映射消息。此外,您可以在故障合约本身上指定一个 exceptionMessage:

    <add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="ThrowNewException" name="Exception">
<exceptionHandlers>
<add exceptionMessage="Oops! A System Error Occurred in the Service Layer." faultContractType="MyTypes.Exceptions.ServiceFault, MyTypes.Exceptions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.FaultContractExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="Default Fault Contract Handler">
</add>

exceptionMessage 将填充到 FaultException 的 Message 属性上。如果您不绘制详细信息,那么这对您来说可能就足够了。

如果您确实想在故障类中填充值,那么您可以分两步完成:

  1. 创建一个处理程序来处理您感兴趣的异常并清理消息。
  2. 创建处理程序以创建 FaultContract

使用 Guy Burstein's WCF Exception Handling with Exception Handling Application Block Integration示例这将设置 ServiceFault 的 MessageText(其余部分基于该示例)。

所以你的服务看起来像这样:

public int CreateOrder(string currency, double amount)
{
try
{
throw new InvalidOperationException("Cannot call this operation!");
}
catch (Exception e)
{
// This sanitizes the message and throws a new Exception
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.
HandleException(e, "SanitizeAndThrow");
}

return 0;
}

然后在配置中,您将创建一个 SanitizeAndThrow 处理程序来清理消息:

  <add name="SanitizeAndThrow">
<exceptionTypes>
<add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="ThrowNewException" name="Exception">
<exceptionHandlers>
<add exceptionMessage="This is a sanitized message."
replaceExceptionType="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ReplaceHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling"
name="Replace Handler" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>

然后你可以使用你的异常屏蔽来创建一个FaultException:

  <add name="WCF Exception Shielding">
<exceptionTypes>
<add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" postHandlingAction="ThrowNewException" name="Exception">
<exceptionHandlers>
<add exceptionMessage="Oops!"
type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.FaultContractExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF"
name="DefaultFaultContract Handler"
faultContractType="Bursteg.Samples.WCFIntegration.ServiceContracts.ServiceFault, Bursteg.Samples.WCFIntegration.ServiceContracts">
<mappings>
<add name="Id" source="{Guid}"/>
<add name="MessageText" source="{Message}"/>
</mappings>
</add>
</exceptionHandlers>
</add>

关于这个例子的一些说明:

  • 如果您不清理异常,则可能会泄露消息。这可以通过让“SanitizeAndThrow”处理程序抛出您自己的自定义异常并让屏蔽策略处理您的自定义类型并映射消息来缓解,但对于任何其他类型不执行任何映射。

    <
  • 此代码未准备好投入生产,也不符合最佳实践。这只是一个例子和一个起点。例如你通常不想捕获一般的 Exception,服务代码没有 NotifyRethrow 逻辑等。

  • 如果需要,您可以创建自定义故障契约处理程序来处理更复杂的场景。

  • 也许有更简单的方法来清除故障异常的Detail(例如,在异常屏蔽中链接处理程序)?

关于c# - 使用企业库异常 block 的 WCF 异常屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5419166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com