2

VSTS2008 + C# + .Net 3.5 を使用して、IIS でホストされる WCF サービスを開発しています。次に、VSTS 2008 のサービス参照の追加機能を使用して、クライアント プロキシ コードを自動的に生成します。

私の質問は、クライアント プロキシ インスタンスを作成し、この特定のインスタンスを使用して、サーバー側で WCF サービスによって公開されているさまざまなメソッドを呼び出すとします。次に、メソッド呼び出しを行うたびに、新しい接続が確立されますか? それとも、クライアントとサーバーの間に一定の接続がありますか (つまり、接続の有効期間は、クライアント プロキシ インスタンスの作成からクライアント プロキシ インスタンスの破棄までです)。

私はbasicHttpBindingを使用しています。

4

4 に答える 4

5

基礎となるチャネルが閉じられると、接続は閉じられます。デフォルトでは、BasicHttpBinding は Keep-Alive 値を含むメッセージで接続 HTTP ヘッダーを送信します。これにより、クライアントはそれらをサポートするサービスへの永続的な接続を確立できます。

これは、サービスのインスタンスが維持されることを意味するのではなく、Web サーバーがサポートしている場合、Web サーバーへの接続のみを意味します。

呼び出しごとに接続を閉じたい場合は、カスタムバインディングを定義してサーバー側でオフにすることができます。

<services> 
 <service>
  <endpoint address=""
        binding="customBinding"
        bindingConfiguration="HttpBinding" 
        contract="IContract" />
 </service>
</services>

<bindings>
 <customBinding>
   <binding name="HttpBinding" keepAliveEnabled="False"/>
 </customBinding>
</bindings>

接続は、プロキシがハングアップする時間に応じて閉じられ、生成されたプロキシは必要に応じて再度開きます。

于 2009-08-15T18:30:50.587 に答える
3

次に、メソッド呼び出しを行うたびに、新しい接続が確立されますか?

はい、これがデフォルトの動作であり、推奨される動作です。これにより、多くの手間が省けます!

「これは、サービスのインスタンスが存続しているという意味ではありません」 -- 「サービスのインスタンスが存続している」とはどういう意味ですか?

「呼び出しごと」のサービスのデフォルトで推奨されるケースでは、次のようになります。

  • クライアント プロキシがサービスへの呼び出しを発行する
  • メッセージはクライアント側でシリアル化され、ネットワーク経由で送信されます
  • サーバー側には「チャネルリスナー」があり、そのメッセージを取得して、どのサービスクラスが呼び出しを処理するかを確認します
  • サーバー側のメッセージ ディスパッチャーは、「YourServiceClass」のインスタンスをインスタンス化します。
  • サーバー側のメッセージ ディスパッチャーは、新しく作成されたサービス クラス インスタンスでそのメソッドを呼び出し、結果を取得して、応答用にパッケージ化します。
  • サーバー側のサービス クラス オブジェクトが解放される
  • 応答がクライアントに返されます

これが、サービス クラスを可能な限り無駄のないものにする必要がある理由の 1 つです。サービス クラスは通常、受信するリクエストごとにインスタンス化され、後で解放されます。

これは非常に悪い考えのように思えるかもしれませんが、サービス オブジェクトのインスタンスが長時間残っている場合は、その状態などを追跡するために多くの簿記を行う必要があります。サービスクラスを作成し、リクエストを処理させてから、再び解放するのが簡単です(そして一般的にははるかに安全でシンプルです)。

マルク

于 2009-08-16T11:25:26.303 に答える
2

ジョージ、考慮すべきことの1つは、接続がどのように、いつ、どのように開いたり閉じたりするかをコードが気にしないようにする必要があるということです。これは主にチャネルの関心事であり、チャネルは、チャネルが「自分のビジネスをどのように考えているか」に依存するコードを記述したことを心配することなく、適切と思われる接続を管理できる必要があります。

パフォーマンスの問題が発生した、または疑われる場合にのみ、このような実装の詳細について心配する必要があります。このような問題が発生する可能性がある場合は、概念実証アプリケーションをすばやく作成し、Fiddlerまたはその他のツールを使用してネットワークトラフィックを監視します。ほとんどの場合、それは時間の無駄になります。

于 2009-08-16T01:29:51.633 に答える
0

接続は、プロキシが破棄されるまで保持されます。

編集

少なくとも信頼できるメッセージングを使用している場合は、TCP 接続を開いたままにします。これは、TCP 接続が失われると信頼できるメッセージングが失敗することに基づいています。見る:

http://codeidol.com/csharp/wcf/WCF-Essentials/Reliability/

編集2

using ステートメントに関するコメントを取り消します。見る:

http://msdn.microsoft.com/en-us/library/aa355056.aspx

少し話が逸れますが、Add Service Reference の使用をやめ、代わりにここで説明する方法を使用します。

http://www.dnrtv.com/default.aspx?showNum=103

注: これは、クライアントとサーバーの両方を制御できる場合にのみ機能します。

于 2009-08-15T17:59:48.250 に答える