如何防止ASP.NET中的浏览器超时?

时间:2011-05-09 15:21:01

标签: c# asp.net .net-4.0 timeout

情景:

用户上传一个小文件或大约100 kB到ASP.NET 4.0应用程序,可能有1000个单位的工作。 然后,服务器开始处理工作单元,一次一个。 由于从外部服务请求信息,每个单元需要几秒钟才能完成。 如果使用事务成功完成所有单元,则结果仅保存到数据库。 完成后,用户可以获得已完成的列表。

问题是用户没有得到确认,相反他的浏览器因为超时而放弃了。

预计未来的文件会增加几倍,从而增加了问题。

我想阻止此超时。

以下是我的一些想法:

  1. 优化代码以更快地运行。这已经完成,不再是问题。
  2. 并行运行请求到外部服务。
  3. 稍微增加服务器超时。
  4. 让用户上传文件,然后在处理完文件后向他发送一封电子邮件,其中包含结果。
  5. 以某种方式刷新页面并在等待时向用户显示一些进度信息,例如5%完成 - 在10分钟内完成。
  6. 我如何实施最后一步,显示进度信息并防止浏览器超时?

    欢迎提出其他建议。

    谢谢,

3 个答案:

答案 0 :(得分:4)

您需要解析处理浏览器响应中的文件。这是通过

实现的
  • 在队列中创建持久性项(即数据库,文件等)以使其具有容错能力
  • 将成功结果返回给浏览器
  • 创建一个队列工作者,以异步处理您的队列。

答案 1 :(得分:2)

您将上传的数据放入数据库的队列中。然后,您有一个异步进程(示例Windows服务)从队列中提取项目并处理它们。您可以使用每个操作的进度更新数据库,完成后,从队列中删除该项并更新其他表。

对于进度,用户可以在队列表中查询其上传状态。

答案 2 :(得分:0)

一个简单的技巧是编写一段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>