web-dev-qa-db-ja.com

WCF-チャネルファクトリとクライアントベース

私はWCFを初めて使用します。最初に、WCFサービスを作成し、生成されたクライアントプロキシを使用して、クライアントからサービスを利用しました。したがって、サービスに対していくつかの操作を実行すると、操作を同期的に呼び出すため、すべてが順番に実行されます。同時実行モードを複数に変更しましたが、それでも操作は同期して行われました。次に、操作の非同期メソッドを生成し、開始/終了パターンを使用して、チャネルを「解放」し、操作を並行して/非同期に実行して、アプリケーションのスループットを向上させたと思います。

次に、ChannelFactoryを使用してチャネルを作成し、クライアントとサーバーがコントラクトを共有できるように操作を実行しました(同じプロジェクト)。ただし、IClientChannelBeginOpen/EndOpen/BeignClose/EndCloseのみを提供します。 ClientBaseBeginOperation/EndOperationメソッドはありません。したがって、基本的に、チャネルで非同期に操作を実行して解放し、チャネルを使用して他の操作を実行できるようにすることはできません。

操作ごとにチャネルを作成するだけで、問題が解決しました

だから私の質問は:

  1. 私のシナリオにはどちらが良いですか(ClientBase vs. ChannelFactory)特に複数のスレッドで同時にサービスオブジェクトに対して複数の操作を実行したい

  2. すべての操作にチャネルを作成することをお勧めしますか?

  3. 実際、2つのエンドポイント(クライアント/サービス)間には1つのチャネルしか持てないと思いました。ただし、必要な数のチャネルを作成できます。例:チャネルのInt16.MaxValueを作成できました。したがって、これに関する制限と推奨事項がわかりません。

    Service[] channels = new IService[Int16.MaxValue];
    
    for(int i = 0; i<Int16.MaxValue; i++)
    {
       channels[i] = factory.CreateChannel();
    }
    

だから基本的にはチャンネルの基本やおすすめやコツなどを教えていただけませんか...など:)

22
Dreamer

ClientBaseChannelFactory<T>の間で非同期を使用することには違いがあります。基本的に、ClientBaseはイベント駆動型非同期モデルを使用します。

私は仕事で開発したアプリケーションでChannelFactory<T>を広範囲に使用しました。これは主に、契約がアプリケーションの共通ライブラリで利用可能であり、サービス参照の追加を使用するのが好きではないためです。作成時にChannelFactoryの一意のインスタンスをそれぞれキャッシュし、操作を呼び出す必要がある場合は、そのインスタンスから通信チャネルを開き、呼び出しを行って、通信チャネルを閉じます。

WCFの起動コストの大部分はクライアントの作成にあります。この方法では、アプリケーションの存続期間中に1回だけ支払います。通信チャネルの作成は簡単です。

ClientBaseChannelFactory<T>の非同期の詳細については、以下を参照してください。

方法:WCFサービス操作を非同期に呼び出す

方法:チャネルファクトリを使用して操作を非同期に呼び出す

27
Tim