【问题标题】:How to prevent browser timeouts in ASP.NET?如何防止 ASP.NET 中的浏览器超时?
【发布时间】:2011-08-21 18:59:40
【问题描述】:

场景:

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

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

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

我想防止这种超时。

以下是我的一些想法:

  1. 优化代码以更快地运行。这已经完成,不再是问题。
  2. 并行运行对外部服务的请求。
  3. 稍微增加服务器超时时间。
  4. 让用户上传文件,然后在文件处理完毕后向他发送一封包含结果的电子邮件。
  5. 以某种方式刷新页面并在等待时向用户显示一些进度信息,例如,完成 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 服务)来从队列中提取项目并进行处理。您可以使用每个操作的进度更新您的数据库,并在完全完成后,从队列中删除该项目并更新您的其他表。

      对于进度,用户可以查询队列表以了解他的上传状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 2011-04-02
        • 2016-09-11
        • 2010-09-18
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多