2011-01-10 11 views
11

ASP.NET Webページのデータプロバイダとして機能するWCF Webサービスがあります。WCFサービスクライアントの再利用

Webページ全体を通して、自動生成されたServiceClientを介してWebサービスに多数の呼び出しが行われます。

現在、私は新しいServiceClientを作成し、各ユーザーの取得、ロールの取得、顧客リストの取得などのために開きます。これらのそれぞれは新しいServiceClientを作成し、新しい接続を開きます。

私のASP.NET Webページ内のすべての関数が同じクライアントを使用できるように、ServiceClientクラスをグローバルまたは静的に使用できるクラスにできますか。これははるかに効率的に見えるでしょう。この方法で何か問題がありますか?これを行うときに考慮すべきアドバイスはありますか?

クライアントに複数のリクエストを行うとどうなりますか?おそらくそれはすべて同期ですので、私はそれに1または50の呼び出しを行うかどうかは関係ありませんか?

おかげ

答えて

7

セッション(セキュリティコンテキストまたは信頼できるセッションを持つwsHttp)または接続(net.tcp、net.pipe)指向のバインディングが使用されている場合は、これを処理するためのマッパーを作成しました。セッションを処理する方法でプロキシを使用します。したがって、プロキシを共有すると、すべての呼び出しが単一のWCFセッションで処理されます(デフォルトでは、単一のサービスインスタンスによって処理されます)。しかし、次のような複雑な処理を行う必要があります。未処理のサービス例外によりチャンネルが終了し、クライアントからの呼び出しが例外になります。

セッションレスHTTPバインディング(basicHttp、webHttp)を使用すると、プロキシを共有したり、静的にすることもできます。各コールは個別に処理されますが、サービス上の例外はチャネルをフォールトさせることはなく、透過的にreuses opened HTTP persistent connectionsとなります。しかし、これにより、新しいプロキシ/チャネルを作成するための大きなオーバーヘッドはありません。

私の提案は次のとおりです。ASP.NETアプリケーションでシングルリクエスト処理でサービスに複数の呼び出しが必要な場合は、同じプロキシ/チャネルを使用します。しかし、異なる要求間でプロキシ/チャネルを共有しないでください。

1

私はあなたの問題を取ることができるChannelFactoryを使用してだと思います。私が正しいとすれば、ChannelFactoryには接続プールがあり、チャンネルを再利用します。これの利点は、チャネルが毎回、最初のものだけに誘発されないということです。

もっとここで読む:ChannelFactory

チャンネルが処分に例外を投げることができるので、あなたには、いくつかの特別な処理を必要とするチャンネルの処分を扱うように。 http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/

+0

これは、すべてのリクエストを1つの接続で処理するのではなく、リクエストごとに新しい接続を作成するだけですか? – Chris

+0

私はそれが各要求のための接続を作成するとは思わない、それはそれを開く(あなたが開いて呼び出すとき)...しかし、私は100%確実ではない。私は、接続を作成することは費用がかかる部分だと思います。これは簡単にチェックすることができ、このようなシンプルなクライアントを実装し、呼び出しをタイミングする場所で2つの同一の呼び出しを行います。もし私が正しいのであれば、2回目の呼び出しははるかに速くなるはずです。 –

+0

そして、通常あなたは**接続を永遠に開いたままにしたくない、通常の流れは開いている接続であり、電話してから閉じてください。 –

関連する問題