1

WCF( C#) サービスからクライアント ( WPF) に送信したい次のクラスがあります。

[DataContract]
    public class OutputAvailableEventArgs
    {
        [DataMember]
        public int ID { get; set; }
        [DataMember]
        public string Message { get; private set; }
        [DataMember]
        public bool IsError { get; private set; }

        public OutputAvailableEventArgs(int id) : this(id, false, "") { }

        public OutputAvailableEventArgs(int id, string output) : this(id, false, output) { }

        public OutputAvailableEventArgs(int id, bool isError, string output)
        {
            ID = id;
            IsError = isError;
            Message = output;
        }
    }

サービスでは次のように使用されます。

var channel = OperationContext.Current.GetCallbackChannel<IClientCallback>();

channel.OutputAvailable(new OutputAvailableEventArgs(1, false, "some message"));

クライアント側では、メンバーはデフォルト値を取得します。
それらをIsRequired属性でマークしようとしましたがOutputAvailable、クライアントで が呼び出されなくなりました。サービス側のコードはスムーズに動作しているようです (デバッガーでは何も気づきませんでした)。

メンバーの値を維持DataContractしながらクラスを転送するにはどうすればよいですか? ( and の 使用を提案するソリューションを見ましたが、デフォルトのコンストラクターだけは必要ありません。)WCF
OnSerializedOnDeserialized

4

1 に答える 1

2

この問題に対するさまざまな解決策を見てきました。他の人のために、それらのいくつかを書き留めます+何が私にとってうまくいったか:

  1. アイテムの順序を指定すると問題が解決する場合があるようです。詳細については、この SO の質問を参照してください。
  2. OnSerializedデフォルトの初期化を行う場合は、 andメソッドを使用しOnDeserializedて初期化メソッドを呼び出すことができます。
  3. IsRequiredまた、自分の で属性を使用しようとしましたDataMemberが、それでもオブジェクトを取得できませんでした。

私にとってうまくいったのは、属性にプロパティを追加することNameSpaceDataContractでした。どうやら、コントラクトが等しいと見なされるようにするには、DataContract の Namespace プロパティを両側で同じ値に設定する必要があります。

于 2013-03-05T11:23:21.420 に答える