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