複数のサービス間で特定の機能を標準化するために外部ライブラリを使用するいくつかのメッセージコントラクトがあります。彼らのコードはこのように見えます...
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と同じ名前空間にリストされる運命にあります。