2011-01-25 12 views
2

質問は、私は1つのWCF呼び出しから複数のFaultExceptionsを返すための最良の方法の上に私の頭を叩いています言うように:1つのWCF呼び出しから複数のFaultExceptionsを返す最も良い方法は何ですか?

シナリオは以下の通りです:
クライアントAが
ClientBは多くを作るのClientBを呼び出しますServerCへの呼び出しにより、FaultExceptionsが返される可能性があります。

すべてのFaultExceptionsをClientAに戻したいと思います。

XmlSerializer、DataContractSerializer、およびNetDataContractSerializerを使用してFaultExceptionsとMessageFault Objectsの両方をシリアル化してデシリアライズしてみました。

本当に気になる要素は、理由、コード、詳細です。私の最後の手段は、理由とコードをシリアル化するコードを手動で記述することですが、これを避けることを望んでいます。

これには他にも方法がありますか?

編集:私は私の質問は、私は次の操作を実行しようとしている擬似コードで

非常に明確ではなかったと思う、私が得ている応答によって判断:

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:

まず、質問に答えようとしてくれた皆様に感謝したいと思います。答えのいくつかは、さまざまな問題に対する答えです。
1つのポスターを提案しましたが、エラーが発生するとすぐに例外がスローされます。残念ながら、これはシステムがどのように動作するようになっているかです。操作される各値は他の値とは完全に独立しており、他の値の成功またはエラーの影響を受けません。私は他の値の処理に影響を及ぼす一つのエラーを望んでいません。
もう1人のポスターが、すべてのフォルトのすべてのFaultExceptionデータを含む何らかの種類のデータ構造体を返すことを提案しました。それは私がやりたいことですが、問題は、FaultExceptionsのリストを返すと、直列化エラーがスローされるということです。 FaultExceptionをシリアル化する方法はありますか?WCF呼び出しから複数のリストを返すことはできますか?

+0

理由だけではなく、道に沿ってFaultExceptionの情報を追加しませんか?あなたはそれをシリアル化する必要はありません、ちょうどそれをClientBでキャッチし、障害の情報にClientAに返された情報を追加しますか? – Will

答えて

2

まあ...私はシナリオの第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の配列を保持することはできません。

あなたは、あなたが複数の例外を収集し、その後、プロパティException[] InnerExceptionsで、元から継承し、カスタムFaultExceptionクラスを作成することができ、それらすべて

を報告したいんた場合である場合。

しかし、この種の「複数の例外」があるとは思いません。おそらく、のネストされた例外を意味し、InnerExceptionの通常のプロパティによって正しく処理されています。

疑似コードを表示できる場合は、それが役に立ちます。

1

要求をSOAPサービスへの応答またはSOAP障害を返すことができます。 FaultException<T>クラスを使用すると、SOAPフォルトを返すことができます。

複数のSOAPフォールトを返すのは意味がありません。サービスCへの呼び出しで障害(FaultException)が返されるとすぐに、作業を停止して自分自身の障害をクライアントに返すべきです。この障害は、操作の障害契約で定義する必要があります。

1

例外のリストをプロパティとして持つ単純なDataContractクラスを作成します。 その後、型付きFaultException <>でこのクラスを使用します。

私は2件のブログの記事で詳細にそれを説明する:

Part 1 Part 2

+0

ありがとうございます。これは私がしたいことに最も近いものです。問題は、例外リストを作成してサーバーからクライアントにシリアル化する方法を理解していないことです。 –

関連する問題