小编典典

Response.End() 被认为是有害的吗?

all

这篇知识库文章
ASP.NETResponse.End()中止了一个线程。

反射器显示它看起来像这样:

public void End()
{
    if (this._context.IsInCancellablePeriod)
    {
        InternalSecurityPermissions.ControlThread.Assert();
        Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
    }
    else if (!this._flushing)
    {
        this.Flush();
        this._ended = true;
        if (this._context.ApplicationInstance != null)
        {
            this._context.ApplicationInstance.CompleteRequest();
        }
    }
}

这对我来说似乎很苛刻。正如知识库文章所说,应用程序中的任何代码Response.End()都不会被执行,这违反了最小惊讶原则。这几乎就像Application.Exit()
WinForms
应用程序中一样。导致的线程中止异常Response.End()是不可捕获的,因此将代码包围在tryfinally中不会满足。

这让我想知道我是否应该总是避免Response.End()

任何人都可以建议,我应该何时使用Response.End(),何时Response.Close()何地HttpContext.Current.ApplicationInstance.CompleteRequest()

参考:Rick Strahl 的博客条目


根据我收到的意见,我的回答是, 是的,Response.End是有害的,但它在某些有限的情况下很有用。

  • 用作Response.End()不可捕获的抛出,HttpResponse在异常情况下立即终止。在调试期间也很有用。 避免Response.End()完成例行的反应
  • 用于Response.Close()立即关闭与客户端的连接。根据此 MSDN 博客文章,此方法 不适用于正常的 HTTP 请求处理。 您极不可能有充分的理由调用此方法。
  • 用于CompleteRequest()结束正常请求。 导致 ASP.NET 管道在当前事件完成后CompleteRequest跳转到该事件。因此,如果您调用,然后在响应中写入更多内容,则写入内容将发送到客户端。EndRequest``HttpApplication``CompleteRequest

编辑 - 2011 年 4 月 13 日

此处提供了进一步的说明:


阅读 130

收藏
2022-07-02

共1个答案

小编典典

ThreadAbortException如果您在应用程序上使用了异常记录器,它会被这些良性Response.End()调用中的 s
淡化。我认为这是微软说“Knock it off!”的方式。

我只会Response.End()在有一些特殊情况并且不可能采取其他行动的情况下使用。也许那时,记录此异常实际上可能表示警告。

2022-07-02