2010-04-16 75 views
20

我的网络应用程序必须处理并提供大量数据才能显示特定页面。有时,用户在服务器仍在忙于处理页面时关闭或刷新页面。这意味着服务器将继续处理数分钟的数据,只将其发送给不再监听的客户端。http服务器能检测到客户端已经取消了他们的请求吗?

是否有可能检测到连接已断开并对其作出反应?

在这个特定的项目中,我们使用Django和NginX,或者Apache。我认为这是可能的,因为Django开发服务器通过打印Broken Pipe异常来对已取消的请求做出反应。我很想让它引发我的应用程序代码可以捕获的异常。 It appears JSP can do thisSo can node.jshere

或者,我可以在有问题的页面上注册卸载事件处理程序,让它执行一个同步XHR,请求取消该用户的先前请求,并进行某种进程间通信以实现此目的。也许,如果较慢的数据处理都交给了另一个进程,我可以更容易地识别和杀灭,而不杀死响应过程...

回答

0

HTTP是无状态的,因此检测断开的客户端是通过超时的唯一途径。

查看this的回答SO问题(Java Servlet:如何检测浏览器关闭?)。

+0

我认为无状态是正确的无字连字,:) – jerjer 2010-04-16 10:16:10

+0

@jerjer - 感谢您的更正:) – Oded 2010-04-16 10:17:16

+0

这似乎很奇怪,因为TCP应该能够做到这一点。我想有些东西在抽象中会丢失。 – 2010-04-16 10:20:01

9

虽然@Oded是正确的HTTP是无状态请求之间,当底层的TCP/IP连接中断对被处理请求应用服务器可以确实检测。为什么是这样?由于TCP是可靠连接的有状态协议。

处理资源密集型请求的.Net Web应用程序的常用技术是在开始资源密集型工作之前检查Response.IsClientConnecteddocs)。浪费CPU周期来向不再存在的客户端发送昂贵的响应毫无意义。

private void Page_Load(object sender, EventArgs e) 
{ 
    // Check whether the browser remains 
    // connected to the server. 
    if (Response.IsClientConnected) 
    { 
     // If still connected, do work 
     DoWork(); 
    } 
    else 
    { 
     // If the browser is not connected 
     // stop all response processing. 
     Response.End(); 
    } 
} 

请回复您的目标应用服务器堆栈,以便我可以提供更相关的示例。

关于你提到的第二个替代使用XHR发布客户端页面卸载事件服务器,@俄德的有关HTTP请求是无状态之间的评论是当场上。这是不太可能的,特别是在有多个服务器的农场中。

相关问题