Пул приложений 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, чтобы заставить это работать?