如何在使用ASP.NET的服务器发送事件时检测断开连接?

4
我在ASP.NET中有以下SSE处理程序:
Response.ContentType = "text/event-stream";
while (true)
{
    Response.Write(string.Format("data: {0}\n\n", DateTime.Now.ToString()));
    Response.Flush();
    System.Threading.Thread.Sleep(1000);
}

它一直运行,即使我关闭了客户端应用程序。如何通知服务器停止处理程序?

我在客户端尝试过:

var source = new EventSource('Handler.aspx');
window.onunload = function() {
     source.close();
}

但是我没有成功。

3
我很确定使用DateTime.Now只是OP的一个例子。 - Bala R
1
我觉得做这样的事情最好的方式是客户端发起推送式请求,服务器一直保持连接直到需要响应时才进行响应,并立即打开一个新的请求。这样就不会有挂起的请求(无论超时时间多长)。 - Chris Carew
@AaronS 这只是我从一个 SSE 教程中复制的示例。 - Jader Dias
@M.Babcock 我担心在浏览器崩溃时,客户端将无法发送断开连接的消息。 - Jader Dias
@M.Babcock 在那个时候,它比简单的推送系统要复杂得多,而且没有真正的收益,因为你仍然需要每隔 x 秒进行请求。一个好的推送系统不需要经常请求,如果你的数据超时时间是 1000ms,那么这将比推送系统需要“轮询”的频率更高。 - Chris Carew
显示剩余6条评论
1个回答

4
你可以使用 HttpResponse 类的 IsClientConnected 属性来检测客户端是否已断开连接。
以下是一个简单的示例:
Response.ContentType = "text/event-stream";
while (true)
{
  Response.Write(string.Format("data: {0}\n\n", DateTime.Now.ToString()));
  Response.Flush();

  if (Response.IsClientConnected == false)
  {
    break;
  }
  System.Threading.Thread.Sleep(1000);
}

因此,使用IsClientConnected属性,您应该能够检测到以下情况:

  1. 在客户端上通过使用source.close()关闭源。
  2. 通过关闭浏览器窗口或导航到另一个网站来关闭连接。

我已经使用ASP.Net 4.0和Google Chrome测试了我的代码。


这个解决方案只在上面的例子中有效,因为服务器经常运行Response.Write()Response.Flush()。在我的应用程序中,这些命令只在有消息要发送时才运行,这种情况很少发生。 - Jader Dias
我提出了一个更具体的问题:http://stackoverflow.com/questions/9771581/how-to-detect-a-disconnection-as-soon-as-it-happens-on-asp-net-without-pooling - Jader Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接