10

私は WCF サービスを使用しており、VS 2008 サービス リファレンスを使用してそのプロキシを作成しました。

WCF サービス メソッドを呼び出す最適なパターンを探しています

  • サービス メソッドを呼び出すたびにクライアント プロキシ インスタンスを作成し、それが完了したらすぐにクライアントを閉じる必要がありますか? クライアント アプリケーションのプロファイリングを行ったところ、プロキシ クライアントの初期化中にチャネルを取得するのに多くの時間がかかっていることがわかりました。
  • 一度だけのインスタンスを使用して再初期化のオーバーヘッドを取り除くことができるように、クライアント プロキシにシングルトン パターンを使用する必要がありますか? このアプローチに隠れた問題はありますか?

私は .Net Framework 3.5 SP1 を使用しておりbasicHttp、ほとんどカスタマイズせずにバインドしています。

4

2 に答える 2

12

場合によります ;-)

次々と複数の呼び出しを必要とするアプリ内のシーケンスがある場合、プロキシ クライアントを保持し、それを使用してさらに呼び出しを行うことができます。ただし、「障害」状態を確認するように警告してください。サーバーでエラーが発生した場合、クライアント プロキシとサーバー間のチャネルが「障害」になり、クライアント プロキシが使用できなくなる可能性があります。

また、高価な部分はの作成ですChannelFactory<T>-コードでクライアントproyxを作成するときに、これらの2つのステップを分離しようとすることができます:

ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();

そのチャネル ファクトリを保持します。たとえば、どこかにキャッシュします

2 番目のステップは、時間と馬力の点でそれほど集中的ではありません。

IYourService client = factory.CreateChannel();

この手順は、すべての呼び出し (または呼び出しシーケンス) の前に行うことができ、パフォーマンスが低下することはありません。

可能な限りシングルトンを避けることを強くお勧めします - それはワームの缶を開けるようなものです.絶対に、積極的にしなければならない場合(たとえば、一度に1人の呼び出し元だけが利用できる単一のリソースへのアクセスを管理するなど)でない限り、それをしないでください.

マルク

于 2009-11-05T17:00:06.603 に答える
1

古い質問を開始して申し訳ありませんが、簡単に参照できるようにこれを追加したかったのです。

marc_s と rally25rs に完全に同意します。そこから始めますが、フォルト状態を処理するプロキシまたはラッパーの使用も検討してください。これは、いくつかの解決策について説明する SOに関する質問です。また、インターネットで Corneliu が見つけた別の優れた解決策「再利用可能な ClientBase プロキシの構築」があります。彼のソリューションは、利便性とパフォーマンスを最大化するためにサービス メソッドを公開するラッパーを生成します。ただし、機能するかどうかはまだテストする必要があります:)。

于 2010-06-18T10:59:27.817 に答える