IIS App Pool kann nicht wiederverwendet werden, wenn ein ASP.NET 4.5-Websocket geöffnet ist.

Ich bin auf ein Problem gestoßen, das folgendermaßen repliziert werden kann (Sie benötigen IIS8, müssen also unter Windows 8+ oder Windows Server 2012 R2 + installiert sein):

Erstellen Sie im IIS-Manager eine neue Website, sagen Sie "TestWs" an Port 8881 und verweisen Sie auf einen neuen Ordner, sagen Sie "C: \ temp \ testws", und fügen Sie dort die folgende Datei "Web.config" hinzu.

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

Nun füge die folgende WsHandler.ashx-Datei im selben Ordner hinzu

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

Erstellen Sie dann ein Websocket in der Entwickler-Symbolleiste in Ihrem Browser wie folgt:

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

Im Task-Manager sehen Sie, dass es für diese Anwendung einen Prozess w3wp.exe gibt. Wenn Sie ihn beenden, wird das Ereignis onclose vom Client ausgelöst und der geschlossene Text gedruckt.

Wenn Sie jedoch ein Websocket wie oben beschrieben erstellen und zum IIS-Manager gehen und den Anwendungspool wiederverwenden, wird das Websocket nicht geschlossen, und es gibt jetzt zwei w3wp.exe-Prozesse.

Schließen des Web-Socketsws.close(); oder das Aktualisieren des Browsers führt dazu, dass der ursprüngliche Prozess w3wp.exe beendet wird.

Es scheint, dass das Vorhandensein des offenen Websockets dazu führt, dass IIS den App-Pool nicht ordnungsgemäß recyceln kann.

Kann jemand herausfinden, was in meinem Code oder in IIS geändert werden muss, damit dies funktioniert?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage