6

初めて WCF サービスを作成しています。サービスとそのすべてのクライアント (少なくとも現時点では) は C# で記述されています。サービスは、渡されたデータに対して多くの入力検証を行う必要があるため、クライアントに無効なデータを示す何らかの方法が必要です。私はフォルトと例外、例外をフォルトにラップすること、そして私をさらに混乱させる多くの矛盾する記事について多くのことを読んできました。このケースを処理する適切な方法は何ですか?

例外を完全に回避し、結果の戻りメッセージをパッケージ化する必要がありますか? 特別なフォールトまたは特別な例外を作成する必要がありますか?それとも、WCF 以外の検証関数の場合のように ArgumentExceptions をスローする必要がありますか?

私が今持っているコード ( MSDNの影響を受ける) は次のとおりです。

[DataContract]
public class ValidationFault
{
    [DataMember]
    public Dictionary<string, string> Errors { get; private set; }

    [DataMember]
    public bool Fatal { get; private set; }

    [DataMember]
    public Guid SeriesIdentifier { get; private set; }

    public ValidationFault(Guid id, string argument, string error, bool fatal)
    {
        SeriesIdentifier = id;
        Errors = new Dictionary<string, string> {{argument, error}};
        Fatal = fatal;
    }

    public void AddError(string argument, string error, bool fatal)
    {
        Errors.Add(argument, error);
        Fatal |= fatal;
    }
}

メソッドには [FaultContract(typeof(ValidationFault))] があります。それで、これはこれにアプローチする「正しい」方法ですか?

4

3 に答える 3

4

WCF サービスから例外をスローしても役に立たないのはなぜですか? それは裸の障害として戻ってくるので、あなたはする必要があります

a) 例外を含めるようにフォルトを設定する

b) フォルトを解析して例外のテキストを取得し、何が起こったかを確認します。

はい、例外ではなくフォールトが必要です。あなたの場合、フォールト コントラクトの一部として検証に失敗したフィールドのリストを含むカスタム フォールトを作成します。

WCF は ISerializable ではないディクショナリで楽しいことを行うことに注意してください。特別な処理があるため、戻ってくるメッセージがネットワーク上で適切に見えることを確認してください。そうでない場合は、配列に戻ります。

于 2008-09-22T12:42:40.487 に答える
3

クライアントで検証を行っていて、メソッドに渡された後(Webサービス呼び出し)に有効な値が必要な場合は、例外をスローします。パラメータの名前でパラメータが無効であることを示す例外である可能性があります。(参照:ArgumentException)

ただし、データを適切に検証するためにクライアントに依存することは望ましくない場合があります。そのため、Webサービスにデータが無効になる可能性があるという想定が残ります。その場合、それは本当に例外的なケースではなく、例外ではありません。その場合、Statusプロパティがenum(OK、Invalid、Incomplete)に設定され、Messageプロパティがパラメータの名前などの詳細が設定されたenumまたはResultオブジェクトを返すことができます。

開発中にこれらの種類のエラーが検出され、修正されることを確認します。QAプロセスでは、クライアントの有効な使用法と無効な使用法を注意深くテストする必要があり、これらの技術メッセージをクライアントに中継したくない場合があります。代わりに、検証システムを更新して、無効なデータがサービス呼び出しに到達しないようにします。

WCFサービスについての私の仮定は、複数のUIが存在することです。1つは現在WebUIである可能性がありますが、後でWinForms、WinCE、または.NETクライアントに期待するものに準拠していないネイティブのiPhone/Androidモバイルアプリケーションを使用して別のUIを追加する可能性があります。

于 2008-09-18T22:33:44.027 に答える
2

MS Patterns and Practices Enterprise Library Validationブロックを、ポリシーインジェクションブロックのリンクテキストと組み合わせて確認することをお勧めします。これにより、データコントラクトメンバーを検証属性で装飾し、サービス実装を統合することができます。 WCFの場合、これは、検証の失敗が、検証の失敗ごとにValidationDetailオブジェクトを含むArgumentValidationExceptionフォールトとして自動的に返されることを意味します。

WCfでentlibを使用すると、多くのコードを記述しなくても、多くの検証やエラー報告を行うことができます。

于 2008-09-22T12:30:52.933 に答える