8

WCFトレースログには多くの"The server has hit a PollingDuplex throttle, MaxSessionsPerAddress, and cannot accept another session from this client. An http error was returned"エラーが表示されます。

MaxSessionsPerAddress設定に関する十分な詳細が見つかりません。常に変更できないというこの投稿を見つけました。MaxSessionsPerAddress10

クライアントプロキシ用に実装したフォールトトレランスロジックに関連するこの問題は、タイムアウトとともにこのような問題が発生する可能性があると考えています。チャネル障害が発生した場合、WCFクライアントプロキシはチャネルを閉じます(Close()、次にAboort() try / catch)その後、5秒ごとに再接続を試み、N回再試行します。おそらく、クライアントは10回の再試行後も接続できなかったため、サービスで10回のセッションが作成されたため、次の再試行はすべて拒否されましたか?

一般情報:

  • PollingDuplex接続
  • この問題は、ライブ環境で一度観察された後、ユーザーに影響を与えないようにオフにされたため、再現できません。
  • IIS HTTPERRログには、失敗したサービスの複数のConnection_Abandoned、Connection_Droppedエントリがあります

WCFクライアント:

  • Silverlight4
  • ClientPollTimeout = 5min
  • InactivityTimeout = 24h、SendTimeout = 30min、CloseTimeout = 3min
  • ReceiveTimeout = 24h、OpenTimeout = 3min

WCFサーバー:

  • IISホスト
  • InstanceContextMode = PerSession
  • ConcurrencyMode = Multiple
  • maxConcurrentCalls、maxConcurrentSessions、maxConcurrentInstancesは500に設定されます
  • HttpBinding、httpTransport、PollingDuplexBindingElement、DuplexChannelFactory
  • sendTimeout = "00:30:00"、receiveTimeout = "24:00:00"、openTimeout = "00:10:00"、closeTimeout = "00:10:00"
  • maxOutputDelay = "00:00:01"、inactivityTimeout = "24:00:00"、serverPollTimeout = "00:02:00"
  • maxReceivedMessageSize = "1073741824"、maxBufferSize = "1073741824"、MaxBufferPoolSize = "2147483647"

どんな助けでも大歓迎です!

4

1 に答える 1

0

主な理由は、クライアントが最終的に失敗し、クライアントが頻繁に(5秒ごとに)再接続することを余儀なくされたためです。再接続後、サーバー/サービスはクライアントの要求を受信しましたが、クライアントは再び失敗し、再接続するたびに新しいWCFサービスセッションが作成されました。クライアントのポーリングがない場合は2分で終了するため、2分で1つのクライアントがサービス側で作成したセッションが多すぎます。

なぜSilverlightクライアントに障害が発生し、切断されたのですか?実際の問題と解決策を説明している次の投稿を参照してください。ポーリングメッセージに対する応答が見つからない404を取得するWCFSilverlightクライアント

適用された他の問題と解決策、おそらく誰もが役立つと思った:

クライアント:

問題:さまざまな理由により、チャネルのクローズ操作がCloseTimeout="00:03:00"数分間スタックする可能性があります。

解決:

  • 10秒に設定closeTimeoutすると、問題が発生した場合にクローズ操作が10秒で強制されるため、クライアントは迅速にクリーンアップを実行します
  • 再接続タイムアウトを5秒から30秒に増やし、古いチャネル接続に関連するすべてのものを解放/クリーンアップできるようにしました

サービス:

問題:CallbackContractクライアントのコールバック呼び出し( )中にサービスがスタックしているのを時々見ました。これは、クライアントのsendTimeout=30minutes切断/障害が原因で操作を完了できないため、サービスのクリーンアップが数分間遅れます30が、障害が発生した場合はできるだけ早くリリース/クリーンアップして破棄する必要があります/切断されたクライアント

解決:

  • sendTimeoutを30秒に設定します。これは、ネットワーク経由で数キロバイトのメッセージを送信するのに十分です。
于 2012-12-25T19:58:11.483 に答える