0

我正在为我的 WCF 服务使用企业库验证应用程序块。一切都很好,.Net 消费者可以捕获FaultException<ValidationFault>异常以获取人类可读的业务错误集合。但是,对于非 .Net 使用者,尤其是那些将要查看原始 SOAP 消息的使用者来说,它看起来并不那么好。SOAP 原因文本始终是“此故障的创建者没有指定原因。 ”这不是很有帮助,因为有一个原因,它在<Detail>元素下指定,如下面的故障消息示例所示。

有什么方法可以将文本“此故障的创建者没有指定原因。 ”更改为更有用的内容,例如“查看 ValidationFault 详细信息”?

<s:Body>
   <s:Fault>
      <s:Code>
         <s:Value>s:Sender</s:Value>
      </s:Code>
      <s:Reason>
         <s:Text xml:lang="en-GB">The creator of this fault did not specify a Reason.</s:Text>
      </s:Reason>
      <s:Detail>
         <ValidationFault xmlns="http://www.microsoft.com/practices/EnterpriseLibrary/2007/01/wcf/validation" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <Details xmlns:b="http://schemas.datacontract.org/2004/07/Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF">
               <b:ValidationDetail>
                  <b:Key i:nil="true"/>
                  <b:Message>Value Validator</b:Message>
                  <b:Tag>request</b:Tag>
               </b:ValidationDetail>
            </Details>
         </ValidationFault>
      </s:Detail>
   </s:Fault>
</s:Body>
4

2 回答 2

3

好吧,EntLib 的人似乎没有想到这个。我已经注意到 EntLib 代码需要更改的地方,并在他们的 CodePlex 站点上提出了一个问题。我想这也可以由任何人作为EntLibContrib项目的一部分来完成,但它们似乎仍然在 Enterprise Library 3.1 上,而我使用的是 4.1。

我想如果有人绝望,解决方案是下载 EntLib 源代码,并修改类中的BeforeCall方法ValidationParameterInspector(在Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF命名空间中)。这是FaultException创建的地方。此构造函数的重载可以指定FaultReason.

于 2009-07-22T14:49:04.267 回答
0

您的 WCF 服务是如何产生这些故障的?

当您查看 WCF 中的FaultException类时,您可以通过多种方式构建其中的一种 - 包括一些允许您为 SOAP 错误指定 FaultReason 的构造函数。

马克

于 2009-07-22T11:31:48.020 回答