【问题标题】:cancel asynch postback with lengthy server process用冗长的服务器进程取消异步回发
【发布时间】:2011-01-15 17:52:16
【问题描述】:

我在取消异步回发时遇到了一些麻烦。我有一个带有更新进度的更新面板,其中包含一个取消按钮,以便用户可以取消回发。当用户单击按钮生成报告时,会显示更新进度。该报告可能需要一些时间,因为它必须循环一千次左右来创建一个 Excel 电子表格。如果用户出于任何原因决定取消运行报告,那么他们可以单击取消按钮,然后我在 javascript 中调用 abortPostBack() 来停止更新进度并再次显示页面。但是,由于服务器仍在处理循环,用户无法执行任何其他操作,例如导航到另一个页面。当用户单击取消按钮时,我将如何停止服务器处理的循环?任何帮助表示赞赏!

【问题讨论】:

  • 根据我的经验,你不能。服务器将始终继续处理请求。

标签: asp.net ajax


【解决方案1】:

您是说在异步回发完成之前,客户端无法访问简单的 HTTP 链接?如果是这样,这听起来像是一个难题,因为您要么必须优化服务器端进程,要么设置更小的服务器端请求超时。或者重新设计您的用户交互以使服务器端 Excel 生成过程成为异步的,而不是同步的,这样用户就不必等到 Excel 生成完成。您可以在客户端对此进行幻想,然后设置一个 JavaScript 计时器以定期查询服务器以查看文件是否已准备好,如果已准备好,请向用户指示并为他们提供下载文件链接选项或其他内容。

否则,如果您可以在等待返回时调用另一个 AJAX 请求(从它的声音来看您可能不会这样做),您可以简单地执行一个新的 HTTP 请求来“取消”长时间运行的进程。但这似乎不起作用,因为服务器仍在处理长时间运行的 HTTP 请求。所以我会选择调查我第一段中的选项。

如果取消确实允许在客户端执行异步 HTTP 请求,那么您可以设置会话状态值来指示已请求取消。就我个人而言,我不会以这种方式接近它。但是,如果您这样做了,那么您长期运行的服务器端进程可能会定期查找会话值的存在。说:

if (Session["cancel-me"] != null) 
{
    Session["cancel-me"] = null;
    abortThisLongProcess();
}

【讨论】:

  • 写入Session 对象意味着您将遇到 ASP.Net 的会话并发 - 它是独占的,这意味着一旦页面访问会话,它就会被锁定,直到该页面完成。
【解决方案2】:

是的,即使您使用浏览器的后退按钮离开页面,只要您单击需要回发到服务器的任何其他内容,页面就会挂起,直到漫长的过程完成。看起来没有办法取消,所以我将不得不重新设计 Excel 生成。

【讨论】:

    【解决方案3】:

    我还没有找到取消正在运行的请求的方法,但没有真正的理由不能开始新的请求。

    默认情况下,ASP.Net 尝试(它不能总是)在会话对象上应用排他锁 - 只要一个页面读取它,所有其他通过相同会话 ID(通过 cookie 或在 URL 上)的页面请求) 必须等待第一页释放会话。

    客户端取消请求并不重要——服务器将继续锁定会话,直到原始页面完成执行。

    我认为解决方案是do away with the ASP session entirely。然后当用户请求另一个页面时,它会立即开始,即使服务器仍在另一个线程上处理旧请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      相关资源
      最近更新 更多