WCF ExceptionShielding错误ID与传递给处理程序的handlingInstanceId不匹配。

56

我在我的服务上装饰了以下内容

<ExceptionShielding("MyExceptionPolicyName")>
当抛出错误异常时,我的策略可以成功捕获错误并将其记录下来。它会获取 handlingInstance Id 并将其与错误一起记录以进行参考。我注意到的是,在故障“Error ID:”中返回的 Guid 与传递给 handling instanceId 的 Guid 不同。
我还尝试过这样装饰操作。
<FaultContract(GetType(ValidationFault))>

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

我想要做的是以某种方式捕获传回给使用者的“错误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>

我执行了一次请求,以获取通过异常屏蔽保护的故障响应。故障响应字符串的格式如下: "在使用此服务时发生错误,请联系管理员获取更多信息。 错误 ID:{GUID}"

然后,我查看了跟踪日志,并没有找到 GUID 或这个字符串的证据。

以下是pastebin链接,供任何想要查看 ExceptionShielding 示例的人使用。

更新2:

根据 @Jay Patel 的评论,我尝试了 -1 和最大 int 值作为 maxMessageLog,以确保在该日志中获取最大数量的数据。

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

日志没有帮助。它对于任何接近回答我的问题的事情都没有包含任何内容。

为了澄清,以防上面不够清楚...我想能够在返回到客户端的消息中捕获“错误ID:”后面的GUID,这样我就可以将其与异常处理程序记录的异常一起记录下来。这样,客户端就可以像消息所说的那样联系“管理员”并附带错误ID,实际上能够找到一些东西。

这是启用完整跟踪的pastbin


所以,我已经在这个问题上发布了一次悬赏。如果有人在某个时候走过来给出答案,我会尽我所能给予50点的悬赏(我甚至不确定你是否可以这样做,但如果有人回答并且我喜欢它,我会发布一个悬赏并奖励那个人... 如果这在堆栈上行不通...好吧...我会给你一个虚拟高五和说谢谢:) - wakurth
1
虽然这可能没有帮助,但你是否尝试过使用WCF跟踪进行日志记录?在这里能看到相同的错误ID吗? - Jay Patel
我还没有。 我会去查看一下。 我工作的公司确实在微软有联系人,我已经向他们提交了这个问题,并被告知他们会将其转发给微软的EntLib团队并给我答案。 在此期间,我将尝试使用WCF跟踪来查看是否有助于指导我如何在服务器端捕获此值。 谢谢。 - wakurth
是的,WCF跟踪的唯一目的是记录所有请求/响应/错误。让我知道进展如何。 - Jay Patel
响应的错误字符串是“在使用此服务时发生错误。请联系您的管理员获取更多信息。错误 ID:{GUID}”,但它在跟踪日志中找不到。 - wakurth
请按照此答案设置您的服务。 - Jay Patel
2个回答

2
根据http://msdn.microsoft.com/en-us/library/ff649012.aspx
您还可以指定源为“{Guid}”,将当前处理实例 ID 添加到故障契约属性中。
在您的 .config 文件中:
<mappings>
    <add source="{Guid}" name="HandlingInstanceId" />
</mappings>

在您的ValidationFault FaultContract中:
[DataMember]
public Guid HandlingInstanceId { get; set; }

注意: "{Guid}"源似乎是Handling Instance ID的特殊标记。
另请参阅: http://entlib.codeplex.com/discussions/232049 还有,最后两个条目: http://entlib.codeplex.com/discussions/243558

这将把处理实例ID添加到返回给消费者的验证故障本身中,但并不能帮助我解决我的问题,即如何捕获“错误ID:{GUID}”。捕获该GUID正是我在问题中概述的内容。 - wakurth

1

记录消息会有帮助吗?如果是这样,我想您需要在配置文件中添加类似以下内容:

<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 希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接