Пул приложений IIS не может быть перезапущен при наличии открытой ASP.NET 4.5 Websocket

Я столкнулся с проблемой, которая может быть реплицирована следующим образом (вам нужен IIS8, поэтому он должен быть в Windows 8+ или Windows Server 2012 R2 +):

Создайте новый веб-сайт в диспетчере IIS, например, TestWs на порту 8881, укажите новую папку, скажем C: \ temp \ testws, и добавьте в нее следующий файл Web.config.

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

Теперь добавьте следующий файл WsHandler.ashx в ту же папку

<%@ 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; } }
}

Затем создайте веб-сокет из панели инструментов разработчика в вашем браузере следующим образом

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

В диспетчере задач вы увидите, что для этого приложения есть процесс w3wp.exe, если вы его убьете, клиент вызовет событие onclose, и закрытый текст будет напечатан.

Однако если вы создадите веб-сокет, как описано выше, перейдете в диспетчер IIS и перезапустите пул приложений, веб-сокет не будет закрыт, и теперь будут два процесса w3wp.exe.

Закрытие веб-сокетаws.close(); или обновление браузера приведет к закрытию исходного процесса w3wp.exe.

Похоже, что наличие открытого веб-сокета приводит к тому, что IIS не может правильно перерабатывать пул приложений.

Может кто-нибудь выяснить, что изменить в моем коде или что изменить в IIS, чтобы заставить это работать?

Ответы на вопрос(3)

Ваш ответ на вопрос