1

WCF サービスを使用しているクライアントで作業しています。さまざまなケースで、サービスは、特定の障害の背後にある理由を通知する関連メッセージとともに FaultException を発生させるだけです。

これらの障害の一部は、クライアント アプリケーションで処理できるものですが、FaultExceptions Message または Reason で文字列の照合を実行して、対応できるものかどうかを判断するのはためらいがあります。

FaultException の FaultCode を使用して、処理できる特定の種類の Fault を識別できることを期待していましたが、これは純粋に少数の SOAP 障害を識別するためのもののようです。これについての私の解釈が間違っている場合は、訂正してください。

FaultException が発生する可能性があることはわかっていますが、障害の背後にある理由ごとに新しい型を作成する必要があると期待するのは非現実的だと感じています。

この状況をどのように処理しますか。わざとらしい例として。次のメソッドを提供するサービスを考えてみましょう。

RecordDetails GetRecordById(string id)

void Add(RecordDetails record)

void Update(RecordDetailsUpdateRequest rdur)

上記の例で、存在しない ID で GetRecordById を呼び出すと、「レコードが見つかりません」というメッセージとともに FaultException を受け取ります。同様に、既に存在するレコードに対して Add を呼び出すか、存在しないレコードに対して Update を呼び出すと、失敗の理由を詳述する Message/Reason を含む FaultException が返されます。更新または挿入する必要があるかどうかを判断するには、レコードが存在するかどうかを知る必要があります。前述したように、文字列が同じままかどうかを制御できないため、単純に文字列を照合することをためらっています。

この状況 (RecordNotFoundException などを詳述する FaultException に関連付けられた型) またはエラーに関連する特定の詳細を定義する FaultException に関連付けられたジェネリック型で何を期待しますか。たとえば、メンバー Code (失敗の理由の定数または列挙識別子) を持つ RecordOperationExcpetion クラスと、ユーザー フレンドリなメッセージ。

少なくともこの方法で、文字列の一致に頼ることなくエラーの原因を特定できました。

あなたの考えは大歓迎です。

4

2 に答える 2

2

私はあなたが上で言ったことに行きます-FaultExceptionに関連付けられたタイプ。DataContract として表されるクラスをいくつでも作成して、さまざまな障害を処理し、それらを WCF サービス操作に割り当てることができます。

[DataContract]
public class RecordOperationException
{
    private int code;
    private string message;

    [DataMember]
    public int Code
    {
        get
        {
            return code;
        }
        set
        {
            code = value;
        }
    }

    [DataMember]
    public string Message
    {
        get
        {
            return message;
        }
        set
        {
            message = value;
        }
    }
}

次に、このクラスを FaultException として割り当てることができます。

[OperationContract]
[FaultContract(typeof(RecordOperationException))]
RecordDetails GetRecordById(string id)

[OperationContract]
[FaultContract(typeof(RecordOperationException))]
void Add(RecordDetails record)

[OperationContract]
[FaultContract(typeof(RecordOperationException))]
void Update(RecordDetailsUpdateRequest rdur)

その後、必要に応じて、メソッドで適切な FaultException をスローできます。

これにより、文字列を比較する必要がなくなります (これは良い考えです、IMO)。

于 2011-07-06T02:41:13.603 に答える
0

あなたのコードがそうであるように、私は常にFaultExceptions を使用し、それらを OperationContract の一部として宣伝します。

しかし、これ以上のものがあると思います。

関心の分離が良いことであることは誰もが知っています。サービスでこれを実現する方法は、IErrorHandler を実装するクラスを作成することです。

これらはクラスで使用でき、エラー処理をロジックから分離して、これを行うためのよりクリーンな方法を作成できます。また、コード全体で同じブロックを繰り返す必要がないことも意味します。

これは、一般的な FaultException でも使用できます。

適切なリソースは次のとおりです。http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx

于 2011-07-06T10:21:02.247 に答える