WCF サービスを使用する場合、サービスを使用するたびにサービスの新しいインスタンスを作成する方がよいでしょうか? それとも作成して再利用したほうがいいですか?どちらのアプローチが優れているのはなぜですか? 非同期プロキシでも同じですか?
4 に答える
それとも、作成して再利用する方が良いですか?
独自のプーリング実装の実装を開始しないでください。それはすでにフレームワークで行われています。WCFプロキシは、その下にあるキャッシュチャネルファクトリを使用します。したがって、新しいプロキシを作成するのにそれほど費用はかかりません(ただし、セッションとセキュリティに関するGuy Starbuckの回答を参照してください)。
また、プロキシは特定のアイドル時間(デフォルトでは10分)後にタイムアウトすることに注意してください。
より明示的な制御が必要な場合は、「すぐに使用できる」ClientBaseプロキシの代わりに、ChannelFactoriesとチャネルを直接使用することを検討してください。
http://msdn.microsoft.com/en-us/library/ms734681.aspx
そして、このトピックに関する「必読」は次のとおりです。http: //blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices .aspx
考慮すべきもう 1 つのポイントは、チャネル障害です。設計上、WCF は未処理の例外が発生した後にクライアント プロキシを使用することを許可しません。
IMyContract proxy = new MyContractClient( );
try
{
proxy.MyMethod( );
}
catch
{}
//Throws CommunicationObjectFaultedException
proxy.MyMethod( );
Guy Starbuck が言及したことに加えて、使用しているセキュリティ モデルが重要な要素になります (セッション要件と併せて) - プロキシを再利用しないと、セキュリティ セッションを再利用できません.
これは、無駄な呼び出しごとにクライアントが自分自身を認証する必要があることを意味します。
ただし、これを行いたいと判断した場合は、セキュリティコンテキストを確立しないようにクライアントを構成してください (決して使用しないため)。これにより、サーバーへのラウンドトリップが数回節約されます :-)
.NET Remoting (WCF に置き換えられたテクノロジの 1 つ) の Server Activated Objects には当然の結果があり、これには "Single Call" (ステートレス) と "Singleton" (ステートフル) の 2 つのモードがあります。
WCF で採用するアプローチは、パフォーマンスとスケーリングの要件と、コンシューマーのニーズ、およびサーバー側の設計上の制約に基づいている必要があります。
サービスへの呼び出し間で状態を維持する必要がある場合は、明らかにステートフルなインスタンスが必要ですが、そうでない場合は、おそらく静的になるように実装する必要があります。バランスなど)。