1

複数のサービス間で特定の機能を標準化するために外部ライブラリを使用するいくつかのメッセージコントラクトがあります。彼らのコードはこのように見えます...

using System.ServiceModel;
using Query.Search;

[MessageContract(WrapperName = "MyMessageContract")]
public partial class MyMessageContract
{
    [MessageBodyMember(Name = "Search")]
    public SearchTerms Search { get;  set; }
}

SearchTermsクラスはQuery.SearchDLLにあり、次のようになります...

public class SearchTerms : List<SearchTerm> { }

...同じDLL内のSearchTermクラスも使用します。これはサービスで問題なく機能し、Query.Searchクラスをアドレス指定していることを認識していますが、プロキシを生成すると、これらのクラスが間違った名前空間に再割り当てされ、UIでサービスアダプターを構築するのが非常に困難になります。私は次の引数でsvcutilを使用しています...

/t:code /mc /n:*,MyProject.UI.Proxies /ct:System.Collections.Generic.List`1 /l:cs 
/o:WSProxies.cs /config:output.config http://localhost:49207/Service1.svc?wsdl 
http://localhost:49207/Service2.svc?wsdl http://localhost:49207/Service3.svc?wsdl

ここで定義されている名前空間引数は、基本的にすべてのプロキシ名前空間をMyProject.UI.Proxiesに割り当てていることを理解しました。これを削除すると、Query.Searchクラスの名前空間が正しく設定されます。ただし、これは、他のすべてのプロキシが、それらが定義されているデフォルトの「MyService.DataContracts」名前空間に分類されることを意味します。だから使ってみた...

/n:MyService.DataContracts,MyProject.UI.Proxies

...しかし、出力が生成された後、出力が「MyService.DataContracts」に戻るため、運がありませんでした。私ができるようにしたいのは、出力ファイルを手動で変更せずに、SearchTermsクラスの名前空間を「Query.Search」として維持しながら、プロキシが「MyProject.UI.Proxies」のUI名前空間を持つようにすることです。 svcutilを実行しても、手動の変更は消去されません。これは可能ですか?/ namespace引数を間違って使用しているだけですか、それともプロキシを生成するたびに出力ファイルを手動で変更する必要がありますか?

編集:これを機能させるために無駄な一日を過ごした後、私は単に回避策を作成し、サービスに同様のクラスのセットを作成し、それらをQuery.Searchのものに変換しました。私が望んでいたことができるかどうかを知りたいのですが、私が集めたものを形成し、メッセージコントラクトでこれらのクラスを使用して、MCと同じ名前空間にリストされる運命にあります。

4

1 に答える 1

1

svcutilプロキシ名前空間と戦うのではなく、クラスを再利用するように指示する必要があります。これは、/referenceパラメーターを使用して実現できます。

そのようなすべてのクラスを別のアセンブリに移動することもお勧めします。そうしないと、WCF サーバーとクライアントの間でアーキテクチャ的に良くない直接参照が行われます。

サンプルについては、このリンクを確認してください。

http://blogs.msdn.com/b/youssefm/archive/2009/10/09/reusing-types-in-referenced-assemblies-with-svcutil-sr-switch.aspx

Visual Studio でも同じタスクを実行できます。ここで私の答えを見てください:

クライアントでカスタム タイプ オブジェクトを使用する方法

アップデート:

私はいくつかの調査をしました。すべてのインターフェイスとデータ コントラクトを含むアセンブリを参照する場合、SVCUtil はプロキシ クラスを生成しません。

その動作は Visual Studio とは異なります。Visual Studio は、SVCUtil を WCF で直接使用していないようです。

これは私が試したコマンドラインです:

C:\Windows\system32>svcutil /directory:D:\prog\myfolder /r:"D:\prog\SampleWcf\Server\bin\Debug\Contract.dll"  http://localhost:8080/Service/mex 

コードとの違いの 1 つは、wsdl の代わりにメタデータを使用したことです。

次の 2 つのオプションがあります。

  1. Visual Studio でプロキシを生成します。
  2. プロファイルを使用せずにサービスを操作するChannelFactory

    BasicHttpBinding myBinding = new BasicHttpBinding();

    EndpointAddress myEndpoint = new EndpointAddress(" http://localhost/MathService/Ep1 ");

    ChannelFactory myChannelFactory = new ChannelFactory(myBinding, myEndpoint);

    IMath wcfClient1 = myChannelFactory.CreateChannel();

http://msdn.microsoft.com/en-us/library/ms734681.aspx

于 2012-06-09T14:00:44.987 に答える