1 に答える
OK - WCF サービスの既定の動作は次のとおりです。
- サーバー上でサービス コントラクト、操作、およびデータ コントラクトを定義します (名前空間 "Server.MyService" など)。
- サービスが起動して実行されたら、クライアントでサービス参照を作成します
- そうするとき、Visual Studio または何をするか
svcutil.exe
は、メタデータ (サービス メソッドとデータの説明) についてそのサービスに問い合わせることです。 - そのメタデータに基づいて、クライアント側のプロキシが生成され (名前空間 "Client.MyService")、サービス コントラクト (メソッド) とデータ コントラクトのレプリカが含まれます。
重要:それらのレプリカが含まれています! それらは同じように見え、ネットワーク上で同じ XML 形式にシリアル化されますが、名前空間が異なります。特に、名前空間が異なります。
これがまさに WCF の性質です。クライアントとサーバーの間でシリアライズされたメッセージを交換するだけです。やり取りするのはテキスト メッセージだけです。それ以上のものはありません - オブジェクト参照もリモートオブジェクトもありません - そのようなものはありません。そんなものは捨てろ!:-)
ワイヤの両端を制御している場合、これは面倒な場合があります。何かを変更する必要がある場合は、サーバー側で変更し、クライアント参照を更新する必要があります。
したがって、ワイヤの両端 (サーバーとクライアントの両方) を制御し、両方が .NET ベースである場合は、次のことができます。
- サービス コントラクトとデータ コントラクト (コントラクトのみ - 実装はありません!) を別のアセンブリに入れます。
- サービスの実装から、アセンブリを契約することを参照してください
- コントラクト アセンブリをクライアントにコピーし、クライアント プロジェクトでも参照します。
ここで、サービス参照を追加すると、デフォルトで、Add Service Reference
Visual Studio の関数は参照されたアセンブリ内の既存の型を再利用します。そのため、共通の「コントラクト」アセンブリを参照している場合、それらの型 (名前空間を含む完全な栄光) は、再利用されます - 追加のコピーは作成されません。
そうすれば、サーバー側のコードとクライアントの両方で使用される単一の共有コントラクト アセンブリを作成でき、データ構造の重複をいじる必要がありません。しかし、繰り返しになりますが、これはワイヤの両端を制御でき、両方が .NET である場合にのみ機能します。