2
4

1 に答える 1

4

OK - WCF サービスの既定の動作は次のとおりです。

  • サーバー上でサービス コントラクト、操作、およびデータ コントラクトを定義します (名前空間 "Server.MyService" など)。
  • サービスが起動して実行されたら、クライアントでサービス参照を作成します
  • そうするとき、Visual Studio または何をするかsvcutil.exeは、メタデータ (サービス メソッドとデータの説明) についてそのサービスに問い合わせることです。
  • そのメタデータに基づいて、クライアント側のプロキシが生成され (名前空間 "Client.MyService")、サービス コントラクト (メソッド) とデータ コントラクトのレプリカが含まれます。

重要:それらのレプリカが含まれています! それらは同じように見え、ネットワーク上で同じ XML 形式にシリアル化されますが、名前空間が異なります。特に、名前空間が異なります。

これがまさに WCF の性質です。クライアントとサーバーの間でシリアライズされたメッセージを交換するだけです。やり取りするのはテキスト メッセージだけです。それ以上のものはありません - オブジェクト参照もリモートオブジェクトもありません - そのようなものはありません。そんなものは捨てろ!:-)

ワイヤの両端を制御している場合、これは面倒な場合があります。何かを変更する必要がある場合は、サーバー側で変更し、クライアント参照を更新する必要があります。

したがって、ワイヤの両端 (サーバーとクライアントの両方) を制御し、両方が .NET ベースである場合は、次のことができます。

  • サービス コントラクトとデータ コントラクト (コントラクトのみ - 実装はありません!) を別のアセンブリに入れます。
  • サービスの実装から、アセンブリを契約することを参照してください
  • コントラクト アセンブリをクライアントにコピーし、クライアント プロジェクトでも参照します。

ここで、サービス参照を追加すると、デフォルトで、Add Service ReferenceVisual Studio の関数は参照されたアセンブリ内の既存の型を再利用します。そのため、共通の「コントラクト」アセンブリを参照している場合、それらの型 (名前空間を含む完全な栄光) は、再利用されます - 追加のコピーは作成されません。

そうすれば、サーバー側のコードとクライアントの両方で使用される単一の共有コントラクト アセンブリを作成でき、データ構造の重複をいじる必要がありません。しかし、繰り返しになりますが、これはワイヤの両端を制御でき、両方が .NET である場合にのみ機能します。

于 2010-04-09T13:01:09.987 に答える