取消长 运行 的 IFRAME
Cancel long running IFRAMEs
我有一个 ASP.NET WebForm 应用程序 - 一个托管一堆 IFRAME "widgets" 的主页。当主页加载时 - 小部件的页面也会加载并开始它们自己的处理,包括连接到 SQL 服务器到 运行 存储过程。
如果用户需要取消这些 IFRAME 处理,最好的方法是什么?我可能可以从客户端将他们的 SRC 设置为 another/blank 页面,从而取消请求,但是如果 IFRAME 页面已经调用 SQL 服务器 - 我该如何取消 SQL 处理呢?
编辑:为了阐明 IFRAMEd 页面中最慢的点是 SQL 服务器存储过程调用,所以基本上这归结为 - 我可以从客户端开始取消 SQL 命令吗?
我想到的一个解决方案是有一个 static List
当前 运行 SqlCommands
,每当用户调用取消您可以从此静态列表中提取命令,然后取消它。正在执行命令的页面会收到命令取消异常,然后可以适当处理。
以下是您需要处理的事项:
- 不知何故用户界面应该有一些键,这样当你按下取消按钮时,用户界面就会将该键发送到取消例程,取消例程将使用该键提取
SqlCommand
并调用它的 Cancel
方法。
- 取消呼叫应通过 AJAX
完成
- 为了线程安全应该进行适当的锁定
更新:
我在这里添加一些细节,
- 这里是http://goo.gl/noKUmj
项目的link
- 以上项目是一个 Web 表单应用程序
- 您可以在此项目中添加任意数量的控制器,路由代码已在
Global.ascx
中添加,因此新控制器应该可以工作
- 但是对于新的 IFRAME 取消,您不必添加另一个控制器。您只需要将
PageName
(作为键)传递给取消控制器
- 限制:这个项目有一个限制,如果你点击一个 IFRAME 的取消按钮,它会取消所有当前的请求,这意味着在多用户环境中,如果一个用户取消了 IFRAME-1,则所有其他用户的所有 IFRAME-1 都将被取消。
- 您可以轻松取消多个IFRAME,因为您可以看到取消按钮代码正在执行JavaScript代码,您只需单击1次调用多个取消代码即可。
您可能已经看到该项目,它使用 PageName
作为 Key 从 List
中提取 SqlCommand
。因此,我们有我上面提到的限制。因为 PageName
对于多个 SqlCommand
是相同的。
为了克服这个限制,你可以生成一个GUID
作为Key,然后将这个GUID
in QueryString
传递给Form1.aspx
和Form2.aspx
页面,所以他们使用这些 GUID
在 List
中添加命令。这些密钥应该在主机页面呈现时或在 JavaScript.
中生成
如果您不想进行 RnD,这里是使用 GUID
作为 Key 的更新项目。 :) http://goo.gl/I86S7Z
我有一个 ASP.NET WebForm 应用程序 - 一个托管一堆 IFRAME "widgets" 的主页。当主页加载时 - 小部件的页面也会加载并开始它们自己的处理,包括连接到 SQL 服务器到 运行 存储过程。
如果用户需要取消这些 IFRAME 处理,最好的方法是什么?我可能可以从客户端将他们的 SRC 设置为 another/blank 页面,从而取消请求,但是如果 IFRAME 页面已经调用 SQL 服务器 - 我该如何取消 SQL 处理呢?
编辑:为了阐明 IFRAMEd 页面中最慢的点是 SQL 服务器存储过程调用,所以基本上这归结为 - 我可以从客户端开始取消 SQL 命令吗?
我想到的一个解决方案是有一个 static List
当前 运行 SqlCommands
,每当用户调用取消您可以从此静态列表中提取命令,然后取消它。正在执行命令的页面会收到命令取消异常,然后可以适当处理。
以下是您需要处理的事项:
- 不知何故用户界面应该有一些键,这样当你按下取消按钮时,用户界面就会将该键发送到取消例程,取消例程将使用该键提取
SqlCommand
并调用它的Cancel
方法。 - 取消呼叫应通过 AJAX 完成
- 为了线程安全应该进行适当的锁定
更新:
我在这里添加一些细节,
- 这里是http://goo.gl/noKUmj 项目的link
- 以上项目是一个 Web 表单应用程序
- 您可以在此项目中添加任意数量的控制器,路由代码已在
Global.ascx
中添加,因此新控制器应该可以工作 - 但是对于新的 IFRAME 取消,您不必添加另一个控制器。您只需要将
PageName
(作为键)传递给取消控制器 - 限制:这个项目有一个限制,如果你点击一个 IFRAME 的取消按钮,它会取消所有当前的请求,这意味着在多用户环境中,如果一个用户取消了 IFRAME-1,则所有其他用户的所有 IFRAME-1 都将被取消。
- 您可以轻松取消多个IFRAME,因为您可以看到取消按钮代码正在执行JavaScript代码,您只需单击1次调用多个取消代码即可。
您可能已经看到该项目,它使用 PageName
作为 Key 从 List
中提取 SqlCommand
。因此,我们有我上面提到的限制。因为 PageName
对于多个 SqlCommand
是相同的。
为了克服这个限制,你可以生成一个GUID
作为Key,然后将这个GUID
in QueryString
传递给Form1.aspx
和Form2.aspx
页面,所以他们使用这些 GUID
在 List
中添加命令。这些密钥应该在主机页面呈现时或在 JavaScript.
如果您不想进行 RnD,这里是使用 GUID
作为 Key 的更新项目。 :) http://goo.gl/I86S7Z