1

[編集] クライアントでコンストラクターと呼び出しコードを使用して D を編集し、OnDeserializing() および OnDeserialized() メソッドを作成しました。

WCF サービス (名前付きパイプ経由) とクライアントがあります。オブジェクト (およびできればそのオブジェクトの参照) を OperationContract の引数として渡す必要があります。

[DataContract]
public class D
{
    [DataMember] 
    public int Id;

    [DataMember] 
    public string StrId;

    //...


    public D(int id, string strid)
    {
        Id = id;
        StrId = strid;
        //...
    }

    [OnDeserialized]
    void OnDeserialized(StreamingContext strmCtx)
    {
    } // breakpoint here (1)

    [OnDeserializing]
    void OnDeserializing(StreamingContext strmCtx)
    {
    } // breakpoint here (2)

}

そしてこれはサービス契約です:

[ServiceContract]
public interface ICalc
{
    [OperationContract]
    int Calculate(string date, int count);

    // d is input of this method, and count and array are outputs.
    [OperationContract]
    int getArray(ref int count, ref int[] array, D d);
}

これは、getArray が呼び出されているクライアント コードです。

proxy.getArray(ref myCount, ref myIntArray, new D(source))

私もこれを試しました:

D d = new D(source)
proxy.getArray(ref myCount, ref myIntArray, d)

どちらの場合も、サービス コード (getArray メソッドのコード) で d を受け取った場合、そのフィールドはすべて null です。何故ですか?私が見逃しているものはありますか?

(トレースを有効にし、トランスポート層でメッセージを確認することを使用して) フィールドのトランスポート層の値がネットワーク上で正しく転送されていることがわかっています。また、OnDeserialized() および OnDeserializing() メソッドをオブジェクトに追加して、そこにブレークポイントを配置できるようにしました。ブレークポイント (1) および (2) では、すべてのフィールドが null です ?!! 実際、オブジェクトセッターはまったく呼び出されていません!!

私はここでアイデアを使い果たしています....

4

4 に答える 4

5

WCFはデータ指向(シリアル化されたxml)であり、オブジェクト指向ではありません。それはうまくいきません!

あなたのサービスオペレーション:

[OperationContract]
int getArray(ref int count, ref int[] array, D d);

intのデータ値を返します。int値と配列値を取得する場合は、両方の値を含む[DataContract]を作成することをお勧めします。このようにして、それらはデータとしてクライアントに渡されます。

(ref int [])を使用してサービス操作を呼び出しても、違いはありません。

いくつかのコードで更新:申し訳ありませんが、エラーを見つけることができません。これは、比較できる小さな例(機能する)です。それでもバグを修正できない場合は、コード全体と構成を投稿することをお勧めします。

using System.Runtime.Serialization;
using System.ServiceModel;

namespace WcfService2
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(InputData value);
    }

    [DataContract]
    public class InputData
    {
        [DataMember]
        public int[] Array { get; set; }
        [DataMember]
        public D SomeStuff { get; set; }
    }

    [DataContract]
    public class D
    {
        [DataMember]
        public int Id { get; set; }
    }
}

using System;

namespace WcfService2
{
    public class Service1 : IService1
    {
        public string GetData(InputData data)
        {
            if (data.Array == null || data.SomeStuff == null)
                throw new NullReferenceException();
            return "OK!";
        }
    }
}

using ConsoleApplication9.ServiceReference;
using System;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            var proxy = new Service1Client();
            var request = new InputData
                {
                    Array = new int[] {1, 2, 3},
                    SomeStuff = new D {Id = 42}
                };
            Console.WriteLine(proxy.GetData(request));
            Console.ReadKey();
        }
    }
}
于 2013-02-19T13:00:28.390 に答える
1

WCF はそれを理解しない場合、デフォルトのコンストラクターを取得しましたか。

また - ref int[] array- とにかく配列は参照型として渡されます。

于 2013-02-19T13:38:53.637 に答える
0

いくつかのパラメーターを DataContract クラスにグループ化した後、同じ問題が発生しました。

私は実際に 2 つのクライアントを持っていましたが、1 つはサーバーとの共有インターフェイス アセンブリを使用しており、問題なく動作していました。ServiceContract と DataContract のコード コピーを使用している他のクライアントが機能しておらず、上記のように、サーバー側の DataContract パラメータのすべてのメンバーが 0 または null でした。

この問題は、クライアントに DataContract を配置した名前空間が原因のようです。DataContract をマスター クライアント アセンブリの名前空間と同じ名前空間に配置することで、問題が解決しました。実際、Callback クラスを除くすべてのコントラクト クラスを同じ名前空間に配置しました。したがって、DataContract だけの問題ではなかったのかもしれません。DataContract を使用していないときは問題なく動作していましたが、それが唯一の問題だったと思います。

それが理にかなっていることを願っています。

于 2014-08-22T20:45:13.373 に答える