Pool longo do SignalR desconectando silenciosamente no IIS 7.5 e no Windows Server 2008 R2

Pool longo do SignalR desconectando silenciosamente no IIS 7.5 e no Windows Server 2008 R2

(Eu fiz esta pergunta no StackOverflow, e contém o código que omiti aqui, mas acho que seria adequado perguntar aqui também, já que é um problema de rede que estou enfrentando)

Tenho uma API (WebAPI) com SignalR hospedada em um IIS 7.5 em um Windows Server 2008 R2 (ambiente de produção) e me conecto ao meu hub por meio de um aplicativo de desktop em execução no Windows 10.

Estou tendo um problema ao estabelecer uma conexão com o LongPollingTransport (eu o uso explicitamente devido à configuração do servidor - os WebSockets não funcionam no Windows Server 2008 R2, até onde eu sei): No início, os clientes se conectam com sucesso e a conexão é recebido com sucesso no Hub do SignalR.

Mas então, o cliente aparentemente se desconecta, porém o cliente não captura nenhum evento de desconexão conforme descrito acima, ele permanece "conectado" mesmo sabendo que não é quando eu chamo um endpoint de API que de fato deveria enviar dados para meu cliente.

Esse problema ocorre apenas nesse ambiente de produção, mas também testei em meu ambiente local/de desenvolvimento (Windows 10) e em ambiente de teste (Windows Server 2012) e funciona bem. Com os logs habilitados, pude perceber que, no ambiente de produção, acontece essa mensagem “está morto” do TransportHeartBeat:

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)

Enquanto isso, em ambientes locais ou de teste, o log mostra uma mensagem "KeepAlive" (que eu gostaria que acontecesse no meu ambiente de produção):

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)

Também na minha aplicação cliente tenho um método para enviar dados ao servidor. Ao diagnosticar com Fiddle, notei que em meus ambientes Local ou Teste, a longa conexão de pooling iniciada pelo cliente é mantida ativa até que o cliente envie alguns dados, então a conexão termina sem nenhum dado pelo servidor e outra é iniciada. Enquanto isso, em meu ambiente de teste, a longa conexão de pool continua mesmo que meu cliente envie dados. Acho que isso acontece porque o servidor não identifica a conexão do cliente, mas achei que seria útil mencionar esse comportamento.

Então, com tudo isso dito, gostaria de saber:

  1. Há algo que devo configurar no IIS para fazer o LongPoolingTransport funcionar?
  2. Alguma ideia de por que meu cliente “pensa” que ainda está conectado?
  3. O que poderia fazer com que uma solicitação de pool longa fosse descartada dessa forma? Como posso diagnosticar isso?

Obrigado!

informação relacionada