2011-01-25 45 views
2

由於這個問題說,我敲我的頭在最好的方法,從一個WCF調用返回多個FaultExceptions:從一次WCF調用中返回多個FaultExceptions的最佳方式是什麼?

的情況如下:
客戶端A撥打電話時ClientB
ClientB使得許多調用ServerC其中一些可能會返回FaultExceptions

我想將所有FaultExceptions返回給ClientA,我還沒有遇到任何好的方法來做到這一點。

我試圖序列化和反序列都FaultExceptions和MessageFault對象與XmlSerializer的,DataContractSerializer的和NetDataContractSerializer無濟於事。

我真正關心的唯一元素是理性,代碼和細節。我最後的手段是手動編寫代碼來序列化原因和代碼,但我希望避免這種情況。

有沒有其他方法可以解決這個問題?

編輯:

class ClientA() 
{ 
    Main() 
    { 
     ClientB.OperateOnManyValues(array[] values) 
    } 
} 

ClientB() 
{ 
    OperateOnManyValues(array[] values) 
    { 
     foreach(Val val in values) 
     { 
      try 
      { 
        ServerC.OperateOnOneValue(val) 
      } 
      catch(FaultException ex) 
      { 
       errorList.Add(ex) 
      } 
     } 
    return errorList 
    } 
} 

編輯2:由我已經得到我覺得我的問題不是很清楚

在僞代碼,我嘗試做如下的答覆來看

首先我想感謝大家試圖回答這個問題。我覺得有些答案是解決不同問題的答案。
一個海報建議我一出現錯誤就會拋出異常。不幸的是,現在系統是如何工作的。每個操作的值都完全獨立於其他值,並且不受其他值的成功或錯誤的影響。我不希望有一個錯誤影響其他值的處理。
另一張海報建議用所有FaultException數據返回某種數據結構以用於所有故障。這是我想要做的,但問題是返回一個FaultExceptions列表會引發序列化錯誤。有沒有什麼辦法來序列化一個FaultException,所以我可以從WCF調用的列表中返回多個?

+0

爲什麼不追加的FaultException的沿途信息?您不必序列化它,只需在ClientB上捕獲它並將錯誤添加到傳回給ClientA的錯誤中的信息中? – Will 2011-01-25 20:19:16

回答

2

那麼......我不完全理解場景的第二部分。如果您的客戶端B的作用就像下面

ServerC.A(); 
[...] 
ServerC.B(); 
[...] 
ServerC.C(); 

while(condition) 
    ServerC.Call(); 

那麼第一異常被自動重新拋出到客戶端B,並可能被再次拋出,以A,所以你不要有多個例外處理。

但是,如果ClientB從不同的線程調用ServerC的幾種方法,那麼你可能有類似的東西。然而,如果ClientB像這樣從ServerC呼叫服務

try 
{ 
    ServerC.A(); 
} catch(Exception ex) 
{ 
    //store exception for A 
} 
    [...] 
try{ 
    ServerC.B(); 
} catch(Exception ex) 
{ 
    //store exception for B 
} 
    [...] 
try 
{ 
    ServerC.C(); 
} catch(Exception ex) 
{ 
    //store exception for C 
} 

您必須按自己的方式處理它。

爲了有一個一致的例外

,報告關於根本原因的信息,你必須使用FaultException類的InnerException財產,但你不能持有InnerExceptions的數組。

如果你是在你做收集多個異常,並想報告他們所有

,那麼你可以創建一個自定義的FaultException類,從以前繼承,有一個屬性Exception[] InnerExceptions的情況。

但是,我再也不相信你有這種「多重例外」。也許你的意思是嵌套異常,這是由InnerException常規屬性正確處理。

如果你能告訴我們一些僞代碼它會有幫助。

1

對SOAP服務的請求可以返回響應或SOAP錯誤。 FaultException<T>類允許您返回SOAP Fault。

返回多個SOAP故障是沒有意義的。一旦您對服務C的調用返回一個錯誤(FaultException),您應該停止工作並將自己的錯誤返回給您的客戶端。該故障必須在操作的故障合同中定義。

1

我會用異常列表創建一個簡單的DataContract類作爲屬性。 然後在類型FaultException <>中使用此類。

我解釋一下兩個博客文章的詳細信息:

Part 1 Part 2

+0

謝謝你的迴應。這是我想要做的最接近的事情。問題是,我還沒有想出如何創建異常列表,以便它們將從服務器序列化到客戶端。 – 2011-01-27 18:41:09

相關問題