【问题标题】:Get rid of ThreadAbortException with httpResponse.End用 httpResponse.End 摆脱 ThreadAbortException
【发布时间】:2013-01-24 20:21:09
【问题描述】:

有谁知道用不会引发性能问题的ThreadAbortException 替换httpResponse.End() 的方法?有人建议做一个'HttpContext.Current.ApplicationInstance.CompleteRequest()',但这并不能做httpResponse.End()所做的一切,比如向客户端发送缓冲数据,这对我来说是个问题。

【问题讨论】:

  • 您是否有任何迹象表明异常真的会导致性能问题?它每秒被抛出多少次,您的服务器对 CPU 的限制程度如何?
  • 我不确定,但我公司的 QA 团队似乎这么认为。
  • 您的 QA 团队应该提供这方面的证据。 (例外并不便宜,但同样,除非您在一台机器上每秒处理数万个请求,否则我希望它们会迷失在噪音中。)

标签: c# asp.net .net vb.net


【解决方案1】:

首先,我怀疑这真的会导致严重的问题。但是,无论如何,这通常都不是一个好主意……这是对异常的滥用,真的。 (无论如何,IMO。)

来自the documentation

提供此方法只是为了与 ASP 兼容,即与 ASP.NET 之前基于 COM 的 Web 编程技术兼容。如果您想跳转到 EndRequest 事件并向客户端发送响应,请改为调用 CompleteRequest

显然当前方法在你调用CompleteRequest后仍会继续,所以你需要确保干净地完成当前事件的处理。

【讨论】:

  • 也可以毫无例外地EndRequest。
【解决方案2】:

好的,我找到了答案here。如果您向下滚动到“Jay Zalos”的答案。我用以下 3 行替换了httpResponse.End()

Response.Flush()
Response.SuppressContent = True
HttpContext.Current.ApplicationInstance.CompleteRequest()

【讨论】:

  • 我认为这不是一个好的解决方案。您需要 SuppressContent 的事实表明正在发生一些奇怪的事情(生成永远不会发送的内容......)。 Flush 也是一个性能问题(即使每个请求只执行一次)。请不要将此标记为答案。它会误导未来的访问者认为这是最佳做法。
猜你喜欢
  • 2010-11-03
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2017-02-03
  • 2015-11-21
  • 1970-01-01
相关资源
最近更新 更多