9

非常に役に立たない方法で作成された wsdl ファイルがあります。これは非常に大きく、場合によってはサイズが数メガバイトにもなり、さまざまな Visual Studio ツールを使用してラッパーを生成すると、生成されるコードベースが非常に大きくなり、性能の低いマシンでは Visual Studio がクラッシュする傾向があります。コンパイル時間はばかげており、結果のクラスは、より動的なアクセス モードが絶対に必要なプロパティ (つまり、ある種のインデクサー) を使用します。サーバー側で変更するオプションはありません。

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

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

4

2 に答える 2

9

WebService で使用可能なメソッドのサブセットをサポートするインターフェイスを手作りして、サービス参照を生成する必要をなくすことができます。

dto や名前空間を含むメソッドの適切な SOAP シグネチャを作成する必要があります。これの欠点は、サービスへの変更を手動で管理しなければならないことです。

ISubsetInterfaceを公​​開するサービスとの通信で作成されたプロキシ クライアントを示す簡単な例を次に示しますIServiceInterface。これを実現するには、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(); }
    }
}
于 2012-06-19T22:33:51.967 に答える
2

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

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

于 2012-06-19T18:04:42.043 に答える