2012-06-19 22 views
9

私は非常に役に立たない方法で構築されたwsdlファイルを持っています。場合によっては数メガバイトの巨大なもので、さまざまなVisual Studioツールを使用してラッパーを生成すると、コードベースが非常に大きくなり、弱いマシンでVisual Studioがクラッシュする傾向があります。コンパイル時間は馬鹿馬鹿しく、結果として得られるクラスは、より動的なアクセスモードが絶対必要である(すなわちある種のインデクサー)プロパティを使用する。サーバー側の変更はありません。異なるインターフェイスを使用してWebサービスを使用する

wsdlファイルは手作業で処理できるものよりはるかに大きく、任意の数があります。これまで私が採用してきたソリューションは、生成された自動生成クラスでリフレクションまたはレイトバインディングを使用することです。しかし、ここではラッパーを扱っているので、です。基本的にSOAPメッセージのクライアントとは別の方法があれば意味があります。

特に、フィールドが関係している場合は、よりダイナミックなインターフェイスを公開するラッパーを作成したいと考えています。タスクは完全に単純ではないので、私は何をすべきか、さまざまなクラス、カスタマイズ可能なコードジェネレータ、WSDLエクスプローラ/パーサなどの提案を探しています。これにより、タスクの時間を短縮します。自分のSOAPクライアントを構築する必要がありますか?私はそれを何に基づいていますか?どのような.NETの機能が私にこの仕事を手伝うことができますか?

+2

私はwsdlを大きくする理由を尋ねますか? – Paparazzi

+0

これは、トンとトンのフィールド/プロパティを持っています。 – GregRos

答えて

9

WebServiceで利用可能なメソッドのサブセットをサポートし、サービス参照を生成する必要性を排除するインターフェイスをクラフトに渡すことができます。

dtoとnamespaceを含むメソッドに対して正しいsoap署名を作成する必要があります。これの欠点は、サービスの変更を手動で管理することが強制されることです。

ここには、IServiceInterfaceを公開しているサービスとの通信でISubsetInterfaceで作成されたプロキシクライアントを示す簡単な例があります。これを実現するには、NameプロパティはIServiceInterfaceコントラクトの名前と一致する必要があります。この場合、デフォルトでは "IServiceInterface"に設定されていますが、ネームスペースとアクションの操作が必要になる場合があります。あなたが操作する必要があることを知る最も簡単な方法は、生成されたwsdlを見ることです。

[TestFixture] 
public class When_using_a_subset_of_a_WCF_interface 
{ 
    [Test] 
    public void Should_call_interesting_method() 
    { 
     var serviceHost = new ServiceHost(typeof(Service)); 

     serviceHost.AddServiceEndpoint(typeof(IServiceInterface), new BasicHttpBinding(), "http://localhost:8081/Service"); 
     serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true; 

     serviceHost.Open(); 

     using(var channelFactory = new ChannelFactory<ISubsetInterface>(new BasicHttpBinding(), "http://localhost:8081/Service")) 
     { 
      var client = channelFactory.CreateChannel(); 

      client.InterestingMethod().Should().Be("foo"); 
     } 

     serviceHost.Close(); 
    } 

    [ServiceContract] 
    interface IServiceInterface 
    { 
     [OperationContract] 
     string InterestingMethod(); 
     [OperationContract] 
     string UninterestingMethod(); 
    } 

    [ServiceContract(Name = "IServiceInterface")] 
    interface ISubsetInterface 
    { 
     [OperationContract] 
     string InterestingMethod(); 
    } 

    class Service : IServiceInterface 
    { 
     public string InterestingMethod() { return "foo"; } 

     public string UninterestingMethod() { throw new NotImplementedException(); } 
    } 
} 
2

DataContractsを含む共有アセンブリを使用することをお勧めします。

次に、ChannelFactory<T>クラスを使用して、サーバーインターフェイスのインスタンスを作成します。その後、WSDLなしでサーバーを呼び出すことができます。

関連する問題