O pool de aplicativos do IIS não pode reciclar quando há um Websocket do ASP.NET 4.5 aberto

Corri para um problema que pode ser replicado da seguinte maneira (você precisa do IIS8, portanto, deve estar no Windows 8+ ou no Windows Server 2012 R2 +):

Crie um novo site no Gerenciador do IIS, diga TestWs na porta 8881, apontando para uma nova pasta, diga C: \ temp \ testws e adicione o seguinte arquivo Web.config lá

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation targetFramework="4.5"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
</configuration>

Agora adicione o seguinte arquivo WsHandler.ashx na mesma pasta

<%@ WebHandler Language="C#" Class="WsHandler" %>

using System;
using System.Threading;
using System.Web;

public class WsHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.AcceptWebSocketRequest(async webSocketContext =>
        {
            while (true)
            {
                await webSocketContext.WebSocket.ReceiveAsync(new ArraySegment<byte>(new byte[1024]), CancellationToken.None);
            }
        });
    }

    public bool IsReusable { get { return true; } }
}

Em seguida, crie um websocket a partir da barra de ferramentas do desenvolvedor em seu navegador, da seguinte maneira

var ws = new WebSocket("ws://localhost:8881/wshandler.ashx");
ws.onclose = function() { console.log('closed'); };

No gerenciador de tarefas, você verá que existe um processo w3wp.exe para esse aplicativo. Se você o matar, o cliente obterá o evento onclose e o texto fechado será impresso.

No entanto, se você criar um websocket como descrito acima e for para o gerenciador do IIS e reciclar o pool de aplicativos, o websocket não será fechado e agora haverá dois processos w3wp.exe.

Fechando o soquete da Webws.close(); ou atualizar o navegador fará com que o processo original do w3wp.exe seja encerrado.

Parece que a presença do websocket aberto está fazendo com que o IIS não consiga reciclar o pool de aplicativos corretamente.

Alguém pode descobrir o que alterar no meu código ou o que alterar no IIS para que isso funcione?

questionAnswers(3)

yourAnswerToTheQuestion