WCF ExceptionShielding错误ID与传递给Handler的handlingInstanceId不匹配

wak*_*rth 56 .net wcf enterprise-library exception fault

我的服务装饰如下

<ExceptionShielding("MyExceptionPolicyName")>
Run Code Online (Sandbox Code Playgroud)

当抛出一个错误异常时,我的策略会收到错误并登录就好了.它接受handlingInstance Id并将其与错误一起记录以供参考.我注意到的是,故障中返回的Guid"错误ID:"与传递给处理instanceId的Guid不同.

我也尝试过装饰这样的操作

<FaultContract(GetType(ValidationFault))>
Run Code Online (Sandbox Code Playgroud)

但这会产生相同的结果.

我想要做的是如何捕获"错误ID:"传递回消费者,以便我可以将其与异常一起记录.*附加信息:异常策略处理程序是一个自定义的处理异常,并将其各种属性和数据记录到特定的异常日志数据库模式中.

有谁知道怎么做到这一点?

更新: 根据@Jay Patel的评论,我将此添加到我的配置中以启用跟踪

<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>
Run Code Online (Sandbox Code Playgroud)

然后,我执行了一个请求,以获得由异常屏蔽屏蔽的故障响应.故障响应字符串的格式如下:"使用此服务时出错.请联系您的管理员以获取更多信息.错误ID:{GUID}"

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

以下是使用ExceptionShielding时关心查看示例的任何人的tracelog 的pastebin链接.

UPDATE2:

再次,根据@Jay Patel的评论,补充说明.我为maxMessageLog尝试了-1和max int值,以确保我在该日志中获得最大量的数据.

<diagnostics>
  <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="2147483647" />
</diagnostics>
Run Code Online (Sandbox Code Playgroud)

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

为了澄清以防上面不清楚...我希望能够在消息中的"错误ID:"之后捕获GUID回到客户端,这样我就可以使用异常处理程序记录的异常来记录它.这样,客户端可以联系"管理员",因为消息显示错误ID,并且实际上能够找到某些内容.

这是启用完整跟踪的pastbin

小智 2

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

您还可以指定源“{Guid}”以将当前处理实例 ID 添加到故障契约属性。

在您的 .config 文件中:

<mappings>
    <add source="{Guid}" name="HandlingInstanceId" />
</mappings>
Run Code Online (Sandbox Code Playgroud)

在您的 ValidationFault 故障合约中:

[DataMember]
public Guid HandlingInstanceId { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

另请参阅: http: //entlib.codeplex.com/discussions/232049

最后两个条目:http://entlib.codeplex.com/discussions/243558