Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 向WCF服务调用方传递第三方异常的更好模式?_.net_Wcf_Exception_Exception Handling_Soapfault - Fatal编程技术网

.net 向WCF服务调用方传递第三方异常的更好模式?

.net 向WCF服务调用方传递第三方异常的更好模式?,.net,wcf,exception,exception-handling,soapfault,.net,Wcf,Exception,Exception Handling,Soapfault,我正在开发一个使用一些第三方服务的WCF解决方案。大多数用户输入和操作都将由第三方服务验证,这意味着我的服务只有在收到第三方异常时才知道出现了问题 我需要设置一些东西来翻译这些异常并将其传递给我自己服务的呼叫者,因为原始异常的消息对于我的呼叫者来说太技术化了,尽管我确实希望他们知道出了什么问题 我正在考虑的解决方案是使用Microsoft企业库异常处理和自定义处理程序,捕获第三方异常,用更友好的消息(来自映射表或类似的消息)替换原始消息,并分配错误代码,然后抛出SOAP错误。第三方异常的完整列表

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

我需要设置一些东西来翻译这些异常并将其传递给我自己服务的呼叫者,因为原始异常的消息对于我的呼叫者来说太技术化了,尽管我确实希望他们知道出了什么问题

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


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

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

(1) 在我自己的服务的服务访问层(从那里我调用第三方服务),每当从第三方接收到异常或错误时,它就会传递到共享DLL,即我的错误重写库

(2) 库从基于XML的配置中查找此类异常或错误是否配置了映射(它尝试通过错误代码、消息、消息正则表达式等进行匹配)。下面是一个示例配置,它指示库将类似“您对项目ABCD的请求无效,因为它已分配给另一个用户:User1234”的消息转换为类似“项目ABCD无法分配给您”的消息,并带有我自己的错误代码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>

您对项(\w{0,10})的请求无效,因为它已分配给另一个用户:(\w{0,10})。
项目1
无法将项{0}分配给您。
(3) 如果第三方开发了尚未映射的新异常或错误,则会使用默认错误,并且可以选择在没有匹配映射时将源错误按原样传递给我的用户

(4) 错误日志记录在主项目的企业库日志记录块中配置,如果配置,则记录源错误、形成的新错误以及使用的映射规则等


这不是完美的解决方案,但它对我的需求很有效,因此我在这里提供它,以防有人为类似需求寻找潜在的解决方案。

请记住,WCF从不通过任何类型的异常。它总是产生错误。听起来您想控制服务返回的故障。没有神奇的方法可以做到这一点。我认为你已经找到了最佳解决方案。大体上,我也是这样处理的。我很好奇-您的WCF服务的客户在收到不同的故障时会做不同的事情吗?是的,该服务将由几个不同的业务合作伙伴使用,这些合作伙伴可能会对同一故障做出不同的反应。对,但他们会倾听您映射到的所有故障吗?我从来没有必要参加所有的仪式,我想知道为什么你显然需要它,而我从来没有。他们会倾听所有的错误,但会自己决定是处理还是丢弃,以及如何处理。重写的主要目标包括:(1)重写源消息(通常需要对系统有深入的了解才能完全理解),使其对最终用户更加友好。(2) 对源系统(例如我们的金融系统)隐藏某些信息。(3) 分配我自己的错误代码,以便于编写故障排除等。(4)如果我用另一个系统替换源错误所在的第三方系统,对我的客户的影响很小(他们处理我的故障)。谢谢你的回答。这更有道理。