Nei*_*afi 8 asp.net iis websocket
我遇到了一个问题,可以通过以下方式进行复制(您需要IIS8,因此必须在Windows 8+或Windows Server 2012 R2 +上):
在IIS管理器中创建一个新网站,在端口8881上说TestWs,指向一个新文件夹,比如C:\ temp\testws,并在那里添加以下Web.config文件
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation targetFramework="4.5"/>
<httpRuntime targetFramework="4.5"/>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
现在将以下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; } }
}
Run Code Online (Sandbox Code Playgroud)
然后在浏览器的开发人员工具栏中创建一个websocket,就像这样
var ws = new WebSocket("ws://localhost:8881/wshandler.ashx");
ws.onclose = function() { console.log('closed'); };
Run Code Online (Sandbox Code Playgroud)
在任务管理器中,您将看到此应用程序有一个w3wp.exe进程,如果您终止它,客户端将获得onclose事件,并将打印关闭的文本.
但是,如果您创建如上所述的websocket并转到IIS管理器并回收应用程序池,则websocket将不会关闭,现在将有两个w3wp.exe进程.
关闭Web套接字ws.close();
或刷新浏览器将导致原始w3wp.exe进程关闭.
似乎打开websocket的存在导致IIS无法正确回收应用程序池.
任何人都可以找出我的代码中要更改的内容或IIS中要更改的内容以使其工作?
据我所知,当WebSocket打开时,IIS不会拆除应用程序域,因此您会看到此行为.
我能建议的最好的是你做一些跨进程信令来强制关闭旧实例.您可以使用EventWaitHandle实现此目的:
在Web应用程序中创建一个名为EventWaitHandle的程序,并在启动时发出信号.
在单独的线程上,等待等待句柄
发出信号后,调用HostingEnvironment.InitiateShutdown强制任何正在运行的旧实例关闭.
归档时间: |
|
查看次数: |
2330 次 |
最近记录: |