2013-04-09 40 views
56

我有以下的装饰我的服务WCF ExceptionShielding错误ID不匹配了handlingInstanceId传递到处理程序

<ExceptionShielding("MyExceptionPolicyName")> 

当故障抛出异常,我的政策拿起就好了错误和日志。它采用handlingInstance Id并将其与错误一起记录以供参考。我注意到的是,在错误中返回的Guid“Error ID:”与传入处理instanceId的错误不同。

我也试着来装饰,像这样

<FaultContract(GetType(ValidationFault))> 

操作,但这会产生相同的结果。

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

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

UPDATE: 每@Jay帕特尔的评论,我已将此添加到我的配置,以使跟踪

<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链接到tracelog,供任何人在使用ExceptionShielding时关心查看其示例。

UPDATE2:

同样,每@Jay帕特尔的评论,添加了此。我为maxMessageLog尝试了-1和max int值,以确保我获得该日志中的最大数据量。

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

该日志没有帮助。它包括没有什么关于什么甚至接近回答我的问题。

的情况下,明确目前尚不清楚上面......我希望能够在之后捕捉到GUID“错误ID:”消息中返回给客户端,所以我可以与是例外记录它由异常处理程序记录。这样客户可以通过Error ID与消息说的“管理员”联系,并且实际上能够找到某些东西。

以下是完整的跟踪启用pastbin

+0

所以,我已经在这一次提出了一个赏金。如果有人在某个时候回答了一个答案,我会尽我所能放弃50分的奖励(我甚至不确定你是否可以这样做,但如果答案来了,我喜欢它,我会发布奖励和奖励那个人......如果这是一个不在这里的堆栈......好吧......我会给你一个虚拟的高五并说谢谢:) – wakurth 2013-05-28 18:49:10

+1

不是说它会帮助你,而是让你在[WCF跟踪](http://msdn.microsoft.com/zh-cn/library/ms733025.aspx)中使用跟踪尝试进行日志记录您是否在此处看到相同的错误ID? – 2013-07-18 05:28:54

+0

我没有。我会看看。我工作的公司在MS有联系,我已经提交了这个问题,并被告知他们会将它传递给MS的EntLib团队,并给我一个答案。同时,我会尝试一下WCF跟踪,看看它是否有助于指导我如何在服务器端捕获此值。谢谢。 – wakurth 2013-07-18 17:24:53

回答

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

+0

这增加它(处理实例ID)到验证错误本身返回给消费者,但不帮我解决我的问题,这是如何捕获“错误ID:{GUID}”。捕获GUID具体是我在问题中概述的 – wakurth 2013-10-20 04:06:35

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

希望这会帮助你。