【问题标题】:Cancel long running IFRAMEs取消长时间运行的 IFRAME
【发布时间】:2015-04-06 20:55:46
【问题描述】:

我有一个 ASP.NET WebForm 应用程序 - 一个承载大量 IFRAME“小部件”的主页。当主页加载时 - 小部件的页面也会加载并开始它们自己的处理,包括连接到 SQL Server 以运行存储过程。

如果用户需要取消这些 IFRAME 处理,最好的方法是什么?我可能会从客户端将他们的 SRC 设置为另一个/空白页面,从而取消请求,但是如果 IFRAME 页面已经调用 SQL Server - 我如何也取消 SQL 处理?

编辑:为了澄清 IFRAMEd 页面中最慢的一点是 SQL Server 存储过程调用,所以基本上这归结为 - 我可以从客户端启动取消 SQL 命令吗?

【问题讨论】:

  • @Yurjy 设置 SRC 可能会取消 IFRAME 中页面的加载,但它可能不会停止当前在 Web 服务器上运行的线程。这意味着查询将在服务器上完全运行,然后响应将被丢弃。这是我的假设,我不太确定。我建议研究 ASP.net 中的异步编程。也是。
  • 奇怪的事情 - 设置 SRC 确实会改变页面,但只是暂时的,当长时间运行的完成处理时 - 它再次出现在 iframe 中..
  • @sallushan - “可能”?绝对不会。
  • @YuriyGalanter - 考虑SqlCommand.CommandTimeoutSqlCommand.Cancel。要使用后者,您当然需要能够从另一个线程获取命令实例,这需要设计/构建额外的基础设施。另外,还有 ASP.NET 序列化相同会话请求的问题 - 如果它们没有标记为会话只读。
  • @YuriyGalanter - 是的,stackoverflow.com/questions/4506273/… - 这应该让此类页面的同一会话请求并行运行

标签: asp.net sql-server iframe cancellation long-running-processes


【解决方案1】:

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

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

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

更新:

我在这里添加一些细节,

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

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

要克服这个限制,您可以生成一个GUID 作为 Key,并将 QueryString 中的 GUID 传递给 Form1.aspxForm2.aspx 页面,以便他们使用这些 @ 在 List 中添加命令987654341@s。这些密钥应在主机页面呈现时或在 JavaScript 中生成。

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

【讨论】:

  • 这种方法的问题是,如果正在处理当前的 HTTP 请求,我将无法进行 AJAX 调用 - AJAX 调用必须等到它完成
  • @YuriyGalanter,您是否将“取消”按钮放在 IFRAME 中显示的同一页面上?我猜不,可能您的取消按钮在主机页面上,那么您应该创建一个单独的处理程序/控制器,该处理程序/控制器将由使用 AJAX 的取消按钮调用,这样将生成一个单独的 HTTP 请求。我有测试项目,你想让我上传到 Google Drive 并分享链接吗?
  • 抱歉延迟响应,现在才看演示,看起来很酷。如果我理解正确 - 每次创建命令时 - 它都会添加到命令的静态列表中(并在成功执行后从其中删除)。如果用户点击取消按钮 - 对 API 控制器进行 AJAX 调用,从而取消命令。这是否意味着我可以轻松地将控制器代码添加到现有的 WebForm 应用程序而无需高级配置(路由等)并且它会起作用?另外这在多用户环境中如何工作?是否可以一次取消多个 iframe?谢谢!
  • 感谢更新信息,我还认为 GUID 是可行的方法,现在正在尝试 :) 我将在我自己的项目中使用该解决方案,并且很可能稍后会接受答案今天。我剩下的唯一担心是 - 如果有超过 2 个 iframe 正在打开并且所有 HTTP 请求都被序列化 - “稍后” iframe 可能仍在等待处理(即它们甚至没有开始执行 SQL 命令而只是等待它们的转) - 在这种情况下做什么。但我会想到一些东西。您的项目对我自己的努力有很大帮助和推动
  • 用你的解决方案写了一篇博文。让我自己记住,也许其他人会觉得它很有用。为了后代:) codecorner.galanter.net/2015/04/14/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2014-10-12
相关资源
最近更新 更多