WCF ExceptionShielding错误ID与传递给Handler的handlingInstanceId不匹配怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

我的服务有以下装饰

<ExceptionShielding("MyExceptionPolicyName")>

当抛出一个错误异常时,我的策略会检测到错误并登录。它采用handlingInstance Id并将其与错误一起记录以供参考。我注意到的是,在错误中返回的Guid“Error ID:”与传递给处理instanceId的错误不同。

我也尝试像这样装饰操作

<FaultContract(GetType(ValidationFault))>

但是这会产生相同的结果。

我想要做的是如何捕获“错误ID:”传回给使用者,以便我可以将其与特例一起记录下来。*补充信息:异常策略处理程序是一个自定义的异常处理程序,它将各种属性和数据记录到特定的异常日志数据库模式中。

任何人都知道如何做到这一点?

我添加到我的配置启用跟踪

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\Temp\Traces.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

然后我执行了一个请求,以获得由异常屏蔽屏蔽的故障响应。错误响应字符串格式如下:“An error has occurred while consuming this service. Please contact your administrator for more information. Error ID: {GUID}”

然后我查看了跟踪日志,发现没有任何关于GUID或此字符串的证据。

以下是使用ExceptionShielding时关注查看示例的人的tracelog 的pastebin链接。

我为maxMessageLog尝试了-1和max int值,以确保我获得该日志中的最大数据量。

<diagnostics>
  <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="2147483647" />
</diagnostics>

日志没有帮助。它甚至没有包含任何关于回答我的问题的内容。

为了澄清上面不清楚的情况......我希望能够在消息中的“错误ID:”之后捕获GUID并将其返回给客户端,这样我就可以记录异常处理程序记录的异常。这样客户可以通过Error ID与消息说的“管理员”联系,并且实际上能够找到某些东西。

这里是完整的跟踪启用pastbin

提问于
用户回答回答于

消息记录会有帮助吗?如果是这样,我想你的配置中需要这样的东西:

<source name ="System.ServiceModel.MessageLogging" 
      switchValue="Verbose, ActivityTracing">        
<listeners>
  <add name="xml" />
</listeners>

请注意,此处的源名称是'System.ServiceModel.MessageLogging',而不是'System.ServiceModel'。

有关完整示例,请参阅以下文章:http : //msdn.microsoft.com/en-us/library/dd788183.aspx

用户回答回答于

根据http://msdn.microsoft.com/en-us/library/ff649012.aspx

还可以指定一个“{Guid}”来源将当前的处理实例ID添加到Fault Contract属性中。

在你的.config文件中:

<mappings>
    <add source="{Guid}" name="HandlingInstanceId" />
</mappings>

在ValidationFault FaultContract中:

[DataMember]
public Guid HandlingInstanceId { get; set; }

注意:“{Guid}”来源似乎是处理实例ID的特殊标记。

另见:http : //entlib.codeplex.com/discussions/232049

最后2项:http : //entlib.codeplex.com/discussions/243558

扫码关注云+社区