更好的模式将第三方例外传递给WCF服务调用者?

时间:2015-03-17 03:59:11

标签: .net wcf exception exception-handling soapfault

我正在开发一种消耗一些第三方服务的WCF解决方案。大多数用户输入和操作都要由第三方服务进行验证,这意味着我的服务只有在收到第三方异常时才知道出现了问题。

我需要设置一些内容来翻译并将这些例外传递给我自己服务的来电者,因为原来的例外情况是'虽然我希望他们知道出了什么问题,但是消息对于我的呼叫者来说太技术化了。

我正在考虑的解决方案是使用Microsoft企业库异常处理,使用自定义处理程序,捕获第三方异常,并用更友好的消息(来自映射表或类似)替换原始消息以及分配我的错误代码,然后抛出SOAP错误。第三方异常的完整列表是未知的,但我确实知道其中大部分 - 对于我计划用通用消息和错误代码替换的未知异常,并记录原始异常。

我认为这个解决方案可行,但可能有更好的方法,因此我发布这个问题来寻求您的专业知识。请分享你的想法。我的主要目标是优雅地处理第三方异常(易于维护处理代码)和翻译消息(易于配置的翻译设置)。

1 个答案:

答案 0 :(得分:0)

最后,我得到了以下解决方案。

(1)在我自己的服务的服务访问层(从我调用第三方服务的地方),每当收到来自第三方的异常或错误时,它都会被传递给共享的DLL,我的错误-rewrite library。

(2)库从基于XML的配置中查找此类异常或错误是否配置了映射(它尝试通过错误代码,消息,消息正则表达式等进行匹配)。下面是一个示例配置,它指示库翻译消息,例如"您对项目ItemABCD的请求无效,因为它已被分配给另一个用户:User1234"类似于" Item ItemABCD无法分配给你"我自己的错误代码Item1。该库采用新的错误代码和消息来形成一个新的故障,可以由我的业务逻辑层进一步处理。

<!-- Each block is the mapping for a certain source error -->
<ErrorMapping>
    <sourceErrorCode></sourceErrorCode>
    <sourceErrorMessage>Your request for item (\w{0,10}) is invalid, because it has been assigned to another user: (\w{0,10}).</sourceErrorMessage>
    <NewErrorCode>Item1</NewErrorCode>
    <NewErrorMessage>Item {0} cannot be assigned to you.</NewErrorMessage>
</ErrorMapping>

(3)如果第三方已经开发了尚未映射的新异常或错误,则使用默认错误,并且可选地将源错误传递给我的用户,就像没有匹配映射一样。

(4)在主项目的Enterprise Library日志记录块中配置了错误日志记录,如果已配置,则会记录源错误,以及形成的新错误和使用的映射规则等。

这不是完美的解决方案,但它可以很好地满足我的需求,因此我在这里提供它,以防有人正在寻找针对类似需求的潜在解决方案。