【问题标题】:HttpHandler Listen for Client Disconnect?HttpHandler 监听客户端断开连接?
【发布时间】:2013-01-23 04:21:12
【问题描述】:

HttpHandler 是否监听与浏览器的断开连接?

我的猜测是“否”,因为它似乎主要/仅用于动态文件创建,那么为什么会这样呢?

但我在 docs 或 goog 中找不到答案。

提前非常感谢!

背景

我想“中止”一个 HttpHandler,因为目前,我允许大量的 excel 导出(~150k sql 行,所以 ~600k html 行)。由于几乎与代码一样荒谬的原因,我有一个查询会触发用户尝试导出的尽可能多的 sql 行。可以想象,这需要很长时间。

我认为我得到了工作进程的支持,因为用户可能对滞后感到沮丧,并再次尝试以较小的结果。我目前每 30 分钟自动刷新一次工作进程,但我宁愿更快地清理。

我现在没有时间清理 sql,所以我只想监听来自客户端的“中止”,如果“中止”则终止处理程序。

【问题讨论】:

  • @jgauffin 我不太确定.net 等价物是什么,但php 有这个php.net/manual/en/function.connection-aborted.php,我猜大多数.net 页面都有相同的。 HttpHandler 会监听客户端断开连接吗?
  • 你想完成什么?
  • @FrazellThomas 请参阅编辑
  • ASP.NET 公开Request.IsClientConnected。这可以与工作线程一起使用,在许多情况下为“黑匣子”报告生成器创建可中止请求。如果报告生成器可以直接修改为协作(即定期检查状态),那么它可以自行轮询,而无需辅助线程。

标签: c# .net vb.net httphandler abort


【解决方案1】:

您希望通过侦听客户端连接断开来完成的任务根本无法真正帮助解决您的问题。您问题的核心是直接在 HttpHandler 中启动的长时间运行的任务。

在这种情况下,即使您可以侦听客户端断开连接,也不会对其采取行动,因为您的代码将忙于执行而无法侦听它。

在诸如此类的长时间运行的进程中正确确定进度并执行操作的唯一方法是确保您的代码是多线程的。在 ASP.NET 中为长时间运行的进程执行此操作的问题是它们将 suck up threads from the thread pool 为您的页面提供服务。正如您所经历的那样,这可能会导致您的网站挂起或响应非常缓慢。

我建议编写一个 Windows 服务来处理这些长时间运行的作业,并将结果吐出到暂存目录中。然后我会使用MSMQ 或类似的方法将请求扔给服务进行处理。

最终,您希望在 ASP.NET 之外获得这个长时间运行的线程,您可以在其中利用多线程可以为您提供的好处。例如,能够报告进度并在需要时中止。

【讨论】:

  • 哈哈。检查告诉我“'不'到HttpHandlers 监听客户端断开连接”。看起来我将不得不把它吸起来并修复 sql。谢谢弗拉兹!
  • 使用 new Thread 将不会使用线程池 - 这是可行的解决方案(连同轮询线程-Join 和 IsClientConnected 以及 icky 非合作线程-Abort)能够中止长时间运行报告世代。这是“正确的方法”吗?可以说 1) Abort 很糟糕,并且只应在协作方法不可行时使用,并且 2) 使用 [n existing] Report queue .. 但 有可能 实现足够“OK”。在 IIS 7.5 中,Response.IsClientConnected 在以轮询方式使用时按预期工作。
  • 如果工作线程忽略/填充 Abort 异常(它可能),那么(假设资源正确地使用 using 等处理)并不比具有未取消的生成更糟糕,如在这两种情况下,“工作必须完成”。 (但如果 Abort 异常被填充或报告生成代码像筛子一样泄漏资源,那么还有其他问题。)
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2017-07-17
  • 2021-12-05
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多