C# 强制下载PDF时使用Response.End

C# 强制下载PDF时使用Response.End,c#,asp.net,httpresponse,C#,Asp.net,Httpresponse,我们最近遇到了一个问题,其中一名开发人员在强制PDF以类似于以下方式下载时,将一行代码从使用HttpResponse.End更改为使用HttpApplication.CompleteRequest: 这样做会导致一些PDF由于非中断空间问题而无法下载,因此代码被改回使用HttpResponse.End 然而,在帮助我的同事时,我进行了一些研究,我遇到了以下问题: 链接到: 考虑到MSDN博客文章中记录的内容,听起来使用HttpResponse.End是错误的方法,所以我想知道是否需要它,或

我们最近遇到了一个问题,其中一名开发人员在强制PDF以类似于以下方式下载时,将一行代码从使用
HttpResponse.End
更改为使用
HttpApplication.CompleteRequest

这样做会导致一些PDF由于非中断空间问题而无法下载,因此代码被改回使用
HttpResponse.End

然而,在帮助我的同事时,我进行了一些研究,我遇到了以下问题:

链接到:


考虑到MSDN博客文章中记录的内容,听起来使用
HttpResponse.End
是错误的方法,所以我想知道是否需要它,或者是否有更好的方法?

这是我过去使用的方法

// Sends all currently buffered output 
HttpContext.Current.Response.Flush(); to the client.

// Gets or sets a value indicating whether to send HTTP content to the client.
HttpContext.Current.Response.SuppressContent = true;

/* Causes ASP.NET to bypass all events and filtering in the HTTP pipeline 
   chain of execution and directly execute the EndRequest event. */
HttpContext.Current.ApplicationInstance.CompleteRequest(); 

以下是
响应中的实际代码。结束

public void End()
{
    if (this._context.IsInCancellablePeriod)
    {
        HttpResponse.AbortCurrentThread();
        return;
    }
    this._endRequiresObservation = true;
    if (!this._flushing)
    {
        this.Flush();
        this._ended = true;
        if (this._context.ApplicationInstance != null)
        {
            this._context.ApplicationInstance.CompleteRequest();
        }
    }
}
ThreadAbortException
用于控制流——基本上允许您使用
Response.End
代替
return
。但是,如果处理程序设计得很好,则可能不需要它,例如,如果
Response.End()
之后没有代码。如果可以避免,通常最好不要抛出异常,因为它(与所有异常一样)将导致堆栈展开和一些性能开销


也许您可以编写自己版本的响应。结束并选择实际执行的代码行,例如,可能您想刷新缓冲区并调用CompleteRequest,但不想引发异常。

如果您有理由手动终止请求,则CompleteRequest是要使用的,如果这导致了其他地方的问题,那么这就是您应该解决和修复的问题。如果您的应用程序在写入响应后自然返回其入口点,则不需要调用任何东西。您是否尝试将文件读取为字节数组并将其作为FileResult返回?它没有回答您的问题,但可能是一个解决办法。我认为您包含的MSDN链接有您想要的答案:“End方法之所以存在,是因为我们在1.0发布时尝试与经典ASP兼容。”然后它继续说,不推荐它,因为它会同步刷新内容,而如果请求以通常的方式结束,则数据将异步发送。“End的文档应说明CompleteRequest是一种更好的方法,可以跳过EndRequest通知并完成请求。”