【问题标题】:How to prevent browser timeouts in ASP.NET?如何防止 ASP.NET 中的浏览器超时?
【发布时间】:2011-08-21 18:59:40
【问题描述】:
场景:
用户将一个小文件或大约 100 kB 上传到可能包含 1000 个工作单元的 ASP.NET 4.0 应用程序。
然后服务器开始处理工作单元,一次一个。
由于从外部服务请求信息,每个单元需要几秒钟才能完成。
仅当所有单元都使用事务成功完成时,结果才会保存到数据库中。
完成后,用户可能会得到一份已完成工作的列表。
问题是用户没有得到确认,而是我认为他的浏览器因为超时而放弃了。
预计未来的文件会大几百倍,从而增加了问题。
我想防止这种超时。
以下是我的一些想法:
- 优化代码以更快地运行。这已经完成,不再是问题。
- 并行运行对外部服务的请求。
- 稍微增加服务器超时时间。
- 让用户上传文件,然后在文件处理完毕后向他发送一封包含结果的电子邮件。
- 以某种方式刷新页面并在等待时向用户显示一些进度信息,例如,完成 5% - 10 分钟内完成。
如何实现最后一步,显示进度信息并防止浏览器超时?
欢迎提出其他建议。
谢谢,
【问题讨论】:
标签:
c#
asp.net
.net-4.0
timeout
【解决方案1】:
您需要从浏览器响应中分离处理文件。这是通过
- 在队列中创建一个持久项(即在数据库、文件等中),使其具有容错性
- 向浏览器返回成功结果
- 创建队列工作器以异步处理您的队列。
【解决方案2】:
一个简单的技巧是编写一段 javacsript 从当前页面重复请求某些内容。如果您使用 HEAD 的请求操作,那么服务器每次只会以最少量的信息进行响应。
类似:
<script src="/js/jquery-1.3.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
setTimeout("callserver()",6000);
});
function callserver() {
var remoteURL = '/yourpage.aspx';
$.get(remoteURL, function(data) { setTimeout("callserver()",6000); });
}
</script>
【解决方案3】:
您将上传的数据放入数据库中的队列中。然后,您有一个异步进程(例如 Windows 服务)来从队列中提取项目并进行处理。您可以使用每个操作的进度更新您的数据库,并在完全完成后,从队列中删除该项目并更新您的其他表。
对于进度,用户可以查询队列表以了解他的上传状态。