2013-06-24 36 views
0

我有一個WCF服務,通過實現IErrorHandler接口實現自定義錯誤處理。從自定義WCF錯誤處理中的客戶端錯誤中分離內部錯誤?

現在,如果客戶端發送帶有無效XML結構的請求,則序列化程序將拋出一個InvalidOperationException異常,並最終導致自定義錯誤處理程序。 但是,InvalidOperationException對我來說似乎是一個非常普遍的例外,我擔心服務器在處理請求時可能會拋出這樣的異常(應該只發生在真正特殊的情況下,但某些奇怪的狀態可能會產生這樣的異常)。

這些是兩個不同的錯誤,並應導致兩個不同的StatusCodes設置爲響應。如何可靠地識別異常的來源,以便我可以在自定義錯誤處理程序中設置正確的StatusCode?

+0

你能區分使用內部異常?希望串行器異常有一些更具體的內部異常,可以幫助你? –

回答

0

我認爲,這是由串行無效XML拋出的異常是有型的內部異常的一個InvalidOperationException System.Runtime.Serialization.SerializationException

如果發現這種情況,可以做所需的錯誤特定處理。例如:

public bool HandleError(Exception error) 
{ 
    string output = "Unknown error"; 

    if (error.InnerException is System.Runtime.Serialization.SerializationException) 
    { 
     output = "Malformed message"; 
    } 

    TraceSource traceSource = new TraceSource("YourTraceSource"); 
    traceSource.TraceEvent(TraceEventType.Error, 0, output); 

    return false; 
} 

或者

public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
{ 
    if (error.InnerException is System.Runtime.Serialization.SerializationException) 
    { 
     //set malformed message status code (400?) 
    } 
    else 
    { 
     //set other status code 
    } 

    ... 
} 
+0

啊,很好的觀察。我會嘗試這種方法。 – Anton

+0

內部異常實際上是一個System.Xml.XmlException,但源代碼是System.Runtime.Serialization,它可以檢測到序列化錯誤,因此我會將您的答案標記爲正確,並對其進行編輯以反映此問題。 – Anton

0

您應該創建自己的異常類,從System.Exception中派生出來,並將它們扔到驗證失敗的地方。在你的IErrorHandler實現中,你應該檢查異常是否屬於你,並返回你想要的狀態碼。例如,如果MyException是派生的異常:

public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
{ 
    MyException me = error as MyException; 
     if(me != null) 
      // Set the status code. 
} 
+0

如果我確切地知道異常會在何時何地出現,那麼是的,我會實現自定義異常(所以我在很多地方都有)。但問題是System.InvalidOperationException並不是我所不知道的,所以不幸的是我們不可能預測它會發生什麼,因此無法趕上。 – Anton