Http 当用户取消请求时,普通web服务器将做什么?

Http 当用户取消请求时,普通web服务器将做什么?,http,transactions,cancellation,Http,Transactions,Cancellation,对于一个不太短的请求,并且用户取消了连接(即,他/她在请求完成之前关闭了浏览器),那么服务器端会发生什么 不过,它应该依赖于服务器。但通常的做法是什么 有些请求需要相当长的时间才能完成,例如,分布式DBMS事务,它将数据提交到不同国家/地区的多个不同服务器。(我知道这在银行应用程序中很常见) 例如,当用户下载大型附件时,某些请求会向客户端发送大量数据 它是否应该在特定超时后取消请求线程 我的web应用程序是否应该处理用户活动,并像这样取消事务: service(request, response

对于一个不太短的请求,并且用户取消了连接(即,他/她在请求完成之前关闭了浏览器),那么服务器端会发生什么

不过,它应该依赖于服务器。但通常的做法是什么

有些请求需要相当长的时间才能完成,例如,分布式DBMS事务,它将数据提交到不同国家/地区的多个不同服务器。(我知道这在银行应用程序中很常见)

例如,当用户下载大型附件时,某些请求会向客户端发送大量数据

它是否应该在特定超时后取消请求线程

我的web应用程序是否应该处理用户活动,并像这样取消事务:

service(request, response):
    tx_start();
    do {
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;

        tx_commit();
        return;
    } while (false);
    tx_rollback();
    throw new CanceledException();
}
我应该吗?

问题:

  • 如果do_some_work()花费的时间超过预期,并且客户端连接已断开,则当事务不再需要时,do_some_work()可能会继续
解决方案:

  • 使用另一个线程分离服务器事务工作和客户端输入
  • 让客户端中断do_all_work(),然后抛出CanceledException
服务(请求、响应){ 试试{ 客户端启动(请求); tx_start(); 做所有的工作吗; tx_commit(); }捕获(取消例外){ tx_回滚(); 投掷ce; }最后{ client_join(); } } 客户端启动(请求){ 客户=新客户(请求); client_thread=新线程(client.start(); } client_join(){ client_thread.join(1000);//等待1s,等待客户端线程结束 }
这并不能回答问题。当用户取消请求时,像IIS和Tomcat这样的Web服务器通常会做什么?我带着同样的问题来到这里。如果用户在长时间请求期间关闭窗口,IIS会做什么?我的期望是IIS将允许线程完成,但放弃输出。否则,我们的代码将需要逻辑来处理中断。 service(request, response) { try { client_start(request); tx_start(); do_all_work(); tx_commit(); } catch(CanceledException ce) { tx_rollback(); throw ce; } finally { client_join(); } } client_start(request) { client = new Client(request); client_thread = new Thread(client).start(); } client_join() { client_thread.join(1000); // wait 1s for the client thread to end }