0

私の状況はこれです。Web サービスを呼び出すたびに、エラー オブジェクトである out パラメータがあります。エラーがない場合、オブジェクトは空であることを示します。エラーが発生した場合、「HasError」フィールド、「ErrorMessage」、「PrettyMessage」などのさまざまなプロパティが入力されます。これでやろうとしているのは、すべてエラーを実装するさまざまなタイプのエラー オブジェクトを作成することです。私がすでに定義したインターフェース。次に、out パラメーターを「out IMyError エラー」のようなものにして、メソッドで発生するエラーの種類に応じて、そのエラー オブジェクトをそのインターフェイスの実装のいずれかに設定できるようにしたいと考えています。私が得ている問題は、シリアライゼーションがこれを気に入らないようだということです。メソッドは正常に実行されますが、私は実行しません クライアント側でデータを取得できません。うまくいけば明確にするためのコードを次に示します。

私のインターフェース

public interface IMyError
{
    bool HasError { get; set; }
    string ErrorType { get; set; }
    string PrettyErrMsg { get; set; }
}

クラスの実装例

[Serializable]
[DataContract]
public class AspError : IMyError
{
    public AspError(Exception exception)
    {
        this.HasError = true;
        this.PrettyErrMsg = "An ASP Exception was thrown";
        this.ExceptionMsg = exception.Message;
        this.StackTrace = exception.StackTrace;
    }

    [DataMember(Name = "has_error", IsRequired = true)]
    public bool HasError { get; set; }

    [DataMember(Name = "error_type", IsRequired = true)]
    public string ErrorType
    {
        get
        {
            return "ASP";
        }
        set
        {
        }
    }

    [DataMember(Name = "pretty_error", IsRequired = true)]
    public string PrettyErrMsg { get; set; }

    [DataMember(Name = "exception", IsRequired = true)]
    public string ExceptionMsg { get; set; }

    [DataMember(Name = "stack_trace", IsRequired = true)]
    public string StackTrace { get; set; }
}

そして、私のWCFサービスのメソッド

public bool MyMethod(out IMyError error)
{
    error = new MyError() { HasError = false };

    try
    {
        // do some code            
    }
    catch (Exception exception)
    {
        error = new AspError(exception);
        return false;
    }
}

私が欲しいのは、そのメソッドが例外をキャッチしたときに、インターフェイスとして実行する前に、過去に機能していた方法で JSON としてフォーマットされた AspError を返すことです。または、IMyError の別の実装クラスが発生した場合は、json としてフォーマットされたその型を返します。どちらも IMyError クラスなので、うまくいくと思いました。

4

1 に答える 1

3

インターフェイスを逆シリアル化する方法のヒントをクライアントに送信する必要があります。WCF は でそれを行いKnownTypeAttributeます。

サービスは次のように変更する必要があります。

[KnownType(typeof(AspError))]
public bool MyMethod(out IMyError error)
{
    ...
}

詳細については、MSDN を参照してください - http://msdn.microsoft.com/en-us/library/ms730167.aspx

もちろん、クライアントは、AspErrorその型を構築できるように、その型を使用してアセンブリにアクセスできる必要があります。

于 2012-07-27T03:43:17.210 に答える