2013-04-09 42 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

希望這會幫助你。