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