4

サービスとクライアントの間でデータをやり取りするために、WCF サービス内にいくつかのデータ クラスを作成しました。そのため、これらの「オブジェクト」は [ServiceContract] と [DataMember] で装飾され、クライアントに公開されるため、オブジェクトをインスタンス化して入力し、サービスに送信できます。ここで、サービス内でポリモーフィズムを使用できることに気付きましたが、クライアントとサービスの間でそれを行うのはあまりうまくいきません。例えば

このサービスには、Ticket というクラスと、Ticket から派生した MOCTicket というクラスがあります。Ticket を引数として受け取るメソッドもあります。通常、そのメソッドに MOCTicket オブジェクトを送信できるはずです。これは Ticket から派生しているため、正常に機能し、サービス内でこれを実行できます。ただし、CLIENT 側で MOCTicket オブジェクトをインスタンス化し、Ticket を受け入れるサービス メソッドに送信しようとすると、エラーがスローされます。これはシリアル化の問題だと思います。

これらのデータクラスから取得できる動作の種類について、私はちょっと混乱しています。一部は取得できますが、他は取得できません。動作/メソッドまたはコンストラクターをシリアル化することはできませんが、遅延ロードされたプロパティをシリアル化することはできます (またはそのように思われます)。いずれにせよ、誰かが私が上で説明したことを達成するのを手伝ってくれるか、それが可能であれば. これらの「オブジェクト」に関する追加の説明もいただければ幸いです。答えを見つけようとグーグルで検索しましたが、これに答えるのに十分明確に書かれたものは見つかりませんでした。ありがとう。

4

2 に答える 2

3

サービスとの間でクラスを渡す代わりに、インターフェイスを渡したり、ServiceKnownType 属性を使用したりしましたか?

例については、リンクを参照してください。

于 2012-06-01T15:25:49.620 に答える
1

少なくともこの段階では、探していたものを見つけたと思います。サービス メソッドに装飾を追加することで、期待する型をシリアライザーに伝えることができます。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [ServiceKnownType(typeof(SvcBaseTicket))]
    [ServiceKnownType(typeof(SvcMOCTicket))]
    bool DoStuff(SvcBaseTicket user);
}

そして、次のように呼び出します。

using(var client = new MyClient())
{
   var ticket = new SvcMOCTicket();
   if(client.DoStuff(ticket))
   {
      //do things
   }
}

実際には偽装された派生クラスである「基本クラス」型を返すサービス クラスが、すべての追加プロパティと共に返されることを確認するためにテストしたところ、実際にそうでした。「ExtensionData」と呼ばれる新しいプロパティとともに。ワンダーバー。

于 2012-06-01T16:26:00.453 に答える