2009-07-30 10 views
5

WCFサービス(WSHttpBinding)を使用するmvcコントローラクラスがあります.HTTPリクエスト内で複数の呼び出しが行われることもあり、そのサービスのクライアントを作成するのにどれだけ費用がかかるかを知りたい場合があります。すべての呼び出しでクライアントのインスタンスを作成しても構いませんか、クラスにメンバー変数を作成する必要がありますか?WCFクライアントのインスタンス化

public class RingbacksController : Controller 
{ 
    private void LoadContactsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 
} 

または

public class RingbacksController : Controller 
{ 
    private RingbackServiceClient client = new RingbackServiceClient(); 

    private void LoadContactsIntoViewData(int page) 
     { 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
     ... 
     client.Close(); 
    } 
} 

答えて

1

あなたはメンバーと一緒に行くことにしたなら、それは障害が発生しますと、その後のすべての呼び出しが失敗することを心に留めておいてください。価値があるかどうかについては、ベンチマークを提案します。

3

クライアントの作成は、通常、ひどい高価な操作ではありません。必要なときにいつでもインスタンス化する必要があります(たとえエラーが原因でエラーが発生した場合でも、それを行う必要があります) 。

ChannelFactoryを使用してチャンネルを作成している場合(その方法の1つ)、ChannelFactoryを作成するのはかなり重く時間がかかる操作なので、できるだけ長くChannelFactoryインスタンスにハングアップしてください。

マルク・

+0

これは、.NET 4.5でも引き続き発生します。http://msdn.microsoft.com/en-us/library/hh314046(v=vs.110).aspx –

2

過去には、私は新しいのChannelFactory <のインスタンス>とWCFサービスへのすべての呼び出しのためのクライアント/プロキシを作成しました。私はそれに何の問題もありませんでした。特にパフォーマンスには問題ありません。私が書いたアプリケーションは、社内ネットワーク(ローカルLAN)に展開され、約30のWindowsフォームクライアントがWCFサービスに接続します。

次の質問Where to trap failed connection on WCF calling class?とそれに対する私の答えを見てください。基本的には、クライアント/プロキシのインスタンス化を処理し、WCFの設計における特定の欠点(リンクされた質問の詳細)を克服するために必要なエラー処理を行うラッパークラスです。

パフォーマンスを心配している場合は、ChannelFactoryとクライアント/プロキシをキャッシュできるように、別のファクトリでそれを書き直すか、別のファクトリでさらにラップすることができます。 ChannelFactoryやクライアント/プロキシをキャッシュするのは悪い考えだと私は聞いたことがありますが、私はここで訂正しています。

関連する問題