IIS 7.5 および Windows Server 2008 R2 で SignalR ロング プーリングがサイレントに切断される

IIS 7.5 および Windows Server 2008 R2 で SignalR ロング プーリングがサイレントに切断される

StackOverflowでこの質問をしました、ここでは省略したコードが含まれていますが、これは私が直面しているネットワークの問題なので、ここでも質問するのが適切だと思います)

Windows Server 2008 R2 (運用環境) の IIS 7.5 でホストされている SignalR を使用した API (WebAPI) があり、Windows 10 で実行されているデスクトップ アプリケーションを介してハブに接続します。

LongPollingTransport との接続を確立するときに問題が発生しています (サーバーの構成により明示的に使用しています。私の知る限り、WebSocket は Windows Server 2008 R2 では動作しません)。最初は、クライアントが正常に接続し、SignalR のハブで接続が正常に受信されます。

しかし、その後、クライアントは明らかに切断されますが、クライアントは上記のように切断イベントをキャッチせず、実際にクライアントにデータを送信する必要がある API エンドポイントを呼び出したときではないことがわかっていても、「接続」されたままになります。

この問題は、その運用環境でのみ発生しますが、ローカル/開発環境 (Windows 10) とテスト環境 (Windows Server 2012) の両方でテストしたところ、正常に動作しました。ログを有効にすると、運用環境で、TransportHeartBeat による次の「is dead」メッセージが表示されることがわかりました。

SignalR.Transports.TransportHeartBeat Information: 0 : Connection 96c15a60-dd1d-47fb-ac57-ea898712738f is New.
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(96c15a60-dd1d-47fb-ac57-ea898712738f)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (96c15a60-dd1d-47fb-ac57-ea898712738f)
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Verbose: 0 : 96c15a60-dd1d-47fb-ac57-ea898712738f is dead
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection 96c15a60-dd1d-47fb-ac57-ea898712738f
SignalR.Transports.LongPollingTransport Information: 0 : Abort(96c15a60-dd1d-47fb-ac57-ea898712738f)
SignalR.Transports.LongPollingTransport Information: 0 : End(96c15a60-dd1d-47fb-ac57-ea898712738f)

一方、ローカルまたはテスト環境では、ログに「KeepAlive」メッセージが表示されます (実稼働環境でもこれが表示されるようにしたいです)。

SignalR.Transports.TransportHeartBeat Information: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d is New.
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d exists. Closing previous connection.
SignalR.Transports.LongPollingTransport Information: 0 : End(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d exists. Closing previous connection.
SignalR.Transports.LongPollingTransport Information: 0 : End(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Verbose: 0 : DrainWrites(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.LongPollingTransport Information: 0 : CompleteRequest (fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : Connection fb4c9f24-7359-4f84-80d4-622b8e4d2e8d exists. Closing previous connection.
SignalR.Transports.LongPollingTransport Information: 0 : End(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(fb4c9f24-7359-4f84-80d4-622b8e4d2e8d)

また、クライアント アプリケーションには、サーバーにデータを送信するメソッドがあります。Fiddle で診断すると、ローカル環境またはテスト環境で、クライアントによって開始された長いプーリング接続は、クライアントがデータを送信するまで維持され、その後、サーバーによってデータが送信されずに接続が終了し、別の接続が開始されることに気付きました。一方、テスト環境では、クライアントがデータを送信しても、長いプーリング接続が継続します。これは、サーバーがクライアント接続を識別しないために発生するものだと思いますが、この動作について言及しておくと役立つと思いました。

それで、以上のことを踏まえて、私が知りたいのは、次のことです。

  1. LongPoolingTransport を動作させるために IIS で構成する必要があるものはありますか?
  2. クライアントがまだ接続されていると「考える」理由について何かご存知ですか?
  3. 長いプーリング要求がこのようにドロップされる原因は何でしょうか? どうすれば診断できますか?

ありがとう!

関連情報