取消长 运行 的 IFRAME

Cancel long running IFRAMEs

我有一个 ASP.NET WebForm 应用程序 - 一个托管一堆 IFRAME "widgets" 的主页。当主页加载时 - 小部件的页面也会加载并开始它们自己的处理,包括连接到 SQL 服务器到 运行 存储过程。

如果用户需要取消这些 IFRAME 处理,最好的方法是什么?我可能可以从客户端将他们的 SRC 设置为 another/blank 页面,从而取消请求,但是如果 IFRAME 页面已经调用 SQL 服务器 - 我该如何取消 SQL 处理呢?

编辑:为了阐明 IFRAMEd 页面中最慢的点是 SQL 服务器存储过程调用,所以基本上这归结为 - 我可以从客户端开始取消 SQL 命令吗?

我想到的一个解决方案是有一个 static List 当前 运行 SqlCommands,每当用户调用取消您可以从此静态列表中提取命令,然后取消它。正在执行命令的页面会收到命令取消异常,然后可以适当处理。

以下是您需要处理的事项:

  1. 不知何故用户界面应该有一些键,这样当你按下取消按钮时,用户界面就会将该键发送到取消例程,取消例程将使用该键提取 SqlCommand 并调用它的 Cancel 方法。
  2. 取消呼叫应通过 AJAX
  3. 完成
  4. 为了线程安全应该进行适当的锁定

更新:

我在这里添加一些细节,

  1. 这里是http://goo.gl/noKUmj
  2. 项目的link
  3. 以上项目是一个 Web 表单应用程序
  4. 您可以在此项目中添加任意数量的控制器,路由代码已在 Global.ascx 中添加,因此新控制器应该可以工作
  5. 但是对于新的 IFRAME 取消,您不必添加另一个控制器。您只需要将 PageName (作为键)传递给取消控制器
  6. 限制:这个项目有一个限制,如果你点击一个 IFRAME 的取消按钮,它会取消所有当前的请求,这意味着在多用户环境中,如果一个用户取消了 IFRAME-1,则所有其他用户的所有 IFRAME-1 都将被取消。
  7. 您可以轻松取消多个IFRAME,因为您可以看到取消按钮代码正在执行JavaScript代码,您只需单击1次调用多个取消代码即可。

您可能已经看到该项目,它使用 PageName 作为 Key 从 List 中提取 SqlCommand。因此,我们有我上面提到的限制。因为 PageName 对于多个 SqlCommand 是相同的。

为了克服这个限制,你可以生成一个GUID作为Key,然后将这个GUID in QueryString传递给Form1.aspxForm2.aspx页面,所以他们使用这些 GUIDList 中添加命令。这些密钥应该在主机页面呈现时或在 JavaScript.

中生成

如果您不想进行 RnD,这里是使用 GUID 作为 Key 的更新项目。 :) http://goo.gl/I86S7Z