1

私はインターネットを閲覧し、答えを求めてスタックオーバーフローしましたが、私の問題に対する明確な答えを得ることができないようです。

全国に約50のクライアントがあり、Windowsサービスを介してサーバーへのWCF WSHTTPBinding呼び出しを10〜20分ごとに定期的に自動的に開きます。これは、サーバーを介して接続して長時間実行する操作を実行できるクライアントの数を制限しているため、うまく機能します。クライアントは、何もできないことを認識し、次にチェックインするときに試行します。

これは、同じルーターの背後に7つの別々のシステムがある1つのクライアントで、非常に遅いインターネットの問題が発生し始めた昨日まで、うまく機能していました。したがって、これらの7つのシステムは、10〜20分ごとにサーバーへの接続を開き、「チェックイン」手順を実行します。呼び出しにはしばらく時間がかかり、サーバーへの最大7つの接続を使用して、各システムを一度にサービスに接続できます。他の43のシステムも、10〜20分ごとに「チェックイン」する必要があります。しかし、7つのシステムを持つクライアントのインターネットが遅いため、サービスで長時間実行されているプロセスへの呼び出しに通常よりも時間がかかり、最終的にクライアントでタイムアウトになりました(セキュリティタイムスタンプエラーが古くなることもありました)。

私のサービスはクライアントのインターネットの問題の影響を完全に受けないようにする必要があり、サービスは「チェックイン」を続ける他のクライアントにサービスを提供し続ける必要があります。

これで、サービス側にサービススロットリング動作を実装しました。

Dim stb As New ServiceThrottlingBehavior
stb.MaxConcurrentSessions = 100
stb.MaxConcurrentCalls = 20
stb.MaxConcurrentInstances = 120

serviceHost.Description.Behaviors.Add(stb)

私はそこを読んでこの設定を見つけましたが、今のところ私のコードにはこれがありません:

System.Net.ServicePointManager.DefaultConnectionLimit

私はこれを理解しようとしましたが、完全には理解していません。それで、今私の説明で、ここに私の質問があります:

  • サービスまたはクライアント側でSystem.Net.ServicePointManager.DefaultConnectionLimitを設定しますか?
  • どこに設定しますか?ServiceHostを開く前に?ServiceHostを作成する前に?
  • WCFの接続制限と同時呼び出しについて変更する他の領域はありますか?(私の読書から、使用しているバインディングによっては、いくつかあるようです)

注:回答を投稿する場合は、コードを使用してください。バインディングに構成ファイルを使用せず、プログラムでバインディングを作成します。

ありがとうございました。

4

1 に答える 1

0

あなたのサービスが何をしているのか理解できません。「遅いインターネット」がそれに影響を与えるはずです。チェックインのたびに大量のデータをやり取りしていますか?デザインの詳細がなければ、何が起こっているのかを正確に言うのは難しいです。

そうは言っても、デザインをもう一度見直すべきだと思います。サーバーがクライアントに応答する前に非常に長時間実行されている操作を実行している場合、クライアントはただぶらぶらして、一度に10分間HTTPで待機するべきではありません。リクエストを送信する方が理にかなっています。その後、時々チェックして、完了したかどうかを確認するか(接続を保持する必要はありません)、バインディングとしてnet.tcpを使用し、このような長い接続を保持するのにより適したものを使用します( net.tcpは、コールバックを使用して、呼び出しが完了したときにクライアントに通知することもできます)。

于 2011-02-11T21:41:00.343 に答える