19

共通のデータ コントラクト (または必要に応じてエンティティ) を共有する一連の WCF サービスを構築しています。これらは、DataContract および DataMember 属性で修飾された単純なデータ転送オブジェクトです。名前と名前空間を明示的に指定しています。サービス契約ごとに平均 12 メンバーという IDesign の推奨事項に従うために、私はサービス プロジェクトを複数のサービスに分割しています。

私のデータ コントラクトは、クライアントが .Net を使用している場合に提供できる別のアセンブリにあります。参照されたアセンブリで型を再利用するようにサービス参照に指示できます。ただし、.net を使用しておらず、同じエンティティを使用する 2 つのサービスを使用している場合、あいまいな参照メッセージが表示されると思います。データ コントラクト dll を参照しない場合、Visual Studio でこれを確認できます。

私の質問は、私のサービスでできることはありますか、またはクライアント アプリで、データ コントラクトがどのプロキシから来たかを修飾する必要を回避するためにできることはありますか?

4

6 に答える 6

11

この問題を解決する方法を説明する素晴らしい記事。 WCFサービス間でのDataContractsの共有

于 2010-08-28T07:11:49.257 に答える
2

また、複数のサービスと多数のクライアントアプリによって参照される1つのアセンブリにすべてのデータコントラクトを保持する傾向があります。これはうまく機能しますが、.NETの外部でサービスを利用しようとしたことはありません。

.NET以外のサービスを利用するために彼らが使用しているテクノロジーを知ることは役立つかもしれません。あいまいな参照メッセージをスローしているのは何ですか?

于 2010-02-24T15:54:43.867 に答える
0

クライアント側で使用しているツールによって異なります。たとえば、Axis2 for Java では、wsdl2java ツールは -u スイッチを使用して型を共有できます。

複数の Axis2 Web サービス クライアント間でプロキシ オブジェクトを共有するにはどうすればよいですか?

于 2010-02-26T14:23:07.107 に答える
0

私の側でオブジェクトを共有する複数のサービスがあります。なぜこの問題が発生しているのかわかりません。私の場合、この方法でオブジェクトにアクセスできます。. . .

SERVICE1 クライアント = 新しい SERVICE1()

client.CommonLibrary.Address. . .

SERVICE2 client2 = 新しい SERVICE2()

client2.CommonLibrary.Address . . . .

于 2010-02-24T17:59:44.173 に答える
0

私の理解と WCF での作業から、完全修飾名が同じであり、同じデータ メンバーを持っている限り、クライアント アプリで使用されるデータ コントラクトのいずれかが問題になることはありません。内部的には、オブジェクトを動的に作成し、パブリック セッターを使用してそれらのデータ メンバー プロパティを再割り当てします。

私が思うより良いアプローチは、データ コントラクトをリファクタリングして、複数のサービスに共通するすべてのものを 1 つのアセンブリに入れ、それらを参照することです。したがって、クライアントが使用するサービスの数に関係なく、このあいまいな問題や競合の問題は発生しません。アプリ。

于 2010-02-26T14:29:42.403 に答える
0

Visual Studio アシスタントではなく、slsvcutil.exe を呼び出すカスタム バッチ ファイルによってサービス プロキシを生成します (Silverlight を使用しているため)。そこで、次のように /n パラメータを使用して名前空間マッピングを指定できます。

"C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\tools\slsvcutil.exe "^
 http://ServiceUrl/MyService.svc^
 **/n:http://youruri.org/CustomerService/DataContracts,CLR.Namespace.CustomerService^**
 /n:*,CLR.Namepsace.MyService^
 /r:"%ProgramFilesFolder%\Reference Assemblies\Microsoft\Framework\Silverlight\v5.0\System.Windows.dll"^
 /ct:System.Collections.ObjectModel.ObservableCollection`1^
 /edb^

したがって、名前空間を持つすべてのデータ コントラクトhttp://youruri.org/CustomerService/DataContractsは、プロキシ ファイル内の clr 名前空間 CLR.Namespace.CustomerService に生成されます。このプロキシを同じプロキシ アセンブリで事前に生成しておけば、この名前空間全体を 2 番目のファイルから切り取ることができ、すべて正常に動作します。最後のステップ用に小さなツールを作成しました。他のすべてのコントラクト名前空間は、CLR.Namepsace.MyService 名前空間に生成されます (すべてをキャッチすることを意味するアスタリスクを参照してください)。

バッチ ファイルを手動で作成する必要があるため、このプロセスをセットアップするのは面倒ですが、これが完了すると、うまく機能します。

于 2012-05-30T06:25:02.253 に答える