【问题标题】:WCF ExceptionShielding Error ID does not match up with handlingInstanceId passed to HandlerWCF ExceptionShielding 错误 ID 与传递给 Handler 的 handlingInstanceId 不匹配
【发布时间】:2013-04-01 13:08:33
【问题描述】:

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

<ExceptionShielding("MyExceptionPolicyName")>

当抛出错误异常时,我的策略会识别错误并正常登录。它采用 handlingInstance Id 并将其与错误一起记录以供参考。我注意到的是,故障“错误 ID:”中返回的 Guid 与传递给处理 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 的评论,添加了这个。我尝试了 maxMessageLog 的 -1 和 max int 值,以确保我在该日志中获得最大量的数据。

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

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

澄清以防上面不清楚...我希望能够在返回给客户端的消息中的“错误 ID:”之后捕获 GUID,以便我可以使用异常处理程序记录的异常。通过这种方式,客户可以联系“管理员”,如消息中所说的错误 ID,并且实际上能够找到一些东西。

这是启用的完整跟踪pastbin

【问题讨论】:

  • 所以,我已经为这个提供了一次赏金。如果有人在某个时候带着答案漫步,我会尽我所能放弃 50 点赏金给他们(我什至不确定你是否可以这样做,但如果有答案并且我喜欢它,我会发布一个赏金并奖励那个人......如果这是一个不在这里的堆栈......好吧......我会给你一个虚拟的高五并说谢谢你:)
  • 不是说它会有所帮助,但您是否尝试过在WCF Tracing 中使用跟踪进行日志记录,您在这里看到相同的错误 ID 吗?
  • 我没有。我会看看。我工作的公司确实在 MS 有一个联系人,我已经提交了这个问题,并被告知他们会将它传递给 MS 的 EntLib 团队并给我一个答案。同时,我将尝试 WCF 跟踪,看看它是否有助于为我指明如何在服务器端捕获此值的方向。谢谢。
  • 是的,WCF 跟踪的唯一目的是记录所有请求/响应/错误。告诉我进展如何。
  • 响应的故障字符串是“使用此服务时发生错误。有关详细信息,请联系您的管理员。错误 ID:{GUID}”并且在跟踪日志中找不到.

标签: .net wcf exception enterprise-library fault


【解决方案1】:

根据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}”源似乎是处理实例 ID 的特殊标记。

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

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

【讨论】:

  • 这会将它(处理实例 ID)添加到返回给消费者的验证错误中,但对我的问题没有帮助,即如何捕获“错误 ID:{GUID}” .捕获该 GUID 正是我在问题中概述的内容
【解决方案2】:

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

<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

希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多