2

通信のために WCF サービスに依存する分散システムに 3 つのプログラムがあります。WCF サービス ライブラリで使用されているデータ型がある場合、サービスを参照したクライアントからどのようにアクセスすればよいですか?

クライアント コンソール アプリケーションから WCF サービスで定義されたオブジェクトをインスタンス化することはできますが、他にできることはあまりありません。オブジェクトのメンバー メソッドまたはフィールドのいずれにもアクセスできません。

たとえば、サービス ライブラリとクライアントで使用される次の Transaction オブジェクト クラスがあります。

[DataContract]
public class Transaction
{
    public int checkoutID;
    public DateTime time;
    public List<object> products;
    public double totalPrice;
    public bool complete;

    [OperationBehavior]
    public void Start(int ID)
    {
        checkoutID = ID;
        products = new List<object>();
        complete = false;
    }

    [OperationBehavior]
    public void Complete()
    {
        time = DateTime.Now;
        complete = true;
    }
}

これは、CompositeType と呼ばれる別のクラスが定義されているサービス (IService) のインターフェイス ファイルから取得されます。私は何が欠けていますか?WCF サービスはメソッドとデータ型のリモート化を許可すると思いましたか?

助けてくれる人に感謝します。私はしばらく WCF で問題を抱えていました。

4

3 に答える 3

8

WCF はメッセージ パッシングシステムです。クライアントとサーバーの共有はすべてサービス コントラクトです(たとえば、サービス メソッドと使用されるデータ型の構造)。

クライアントとサーバーの間の通信は、基本的にデータ コントラクト オブジェクトの XML シリアル化表現です。しかし、WCF はデフォルトでコードを共有せず、コントラクトのみを共有します (たとえば、データ型/クラスではなく、それらの XML 表現のみ)。

したがって、デフォルトでは、クライアントが特定のサービスのクライアント プロキシを作成すると、サービス メソッドと、やり取りされるデータの XML 形式を判別できます。その情報に基づいて、クライアント側を作成します。ネットワーク上でまったく同じ XML 表現を持つデータ クラス - ただし、それらは (クライアント側の名前空間で) 異なる .NET クラスです。

通信の両端 (サーバーとクライアント) を制御し、両方が .NET を使用している場合は、次のようにすることができます。

  • サービスとデータ コントラクトを別のアセンブリ (YourService.Contractsまたはそのようなもの)に入れます。

  • サーバー側のコードがそのアセンブリを参照し、そのインターフェイスと型を使用できるようにする

  • クライアント側プロキシを作成する前に、その共有コントラクト アセンブリへの参照を追加します。

  • この場合、(Add Service Referenceまたはsvcutilコマンド ライン ツールを使用して) クライアント側プロキシを作成すると、WCF ランタイムは、既に必要な型を認識していることを検出し (それらは共有アセンブリで定義されているため)、再利用します。新しいクライアント側のみのデータ クラスを作成する代わりに、それらの共有型。

于 2012-04-30T13:46:43.323 に答える
0

あなたの質問を完全に理解することはできませんが、上に貼り付けたコードから、フィールド/プロパティではなくメソッドを WCF クライアントと共有しています。フィールドにも [DataMember] 属性を適用する必要があります。

于 2012-04-30T13:46:11.937 に答える
0

[DataMember] タグをフィールドに追加すると、シリアル化されます。

また、[OperationContract] は [OperationBehavior] ではなく、メソッドにある必要があります。

于 2012-04-30T13:46:17.510 に答える