强制PDF下载时使用Response.End

时间:2016-07-22 15:41:00

标签: c# asp.net httpresponse

最近我们遇到了一个问题,其中一位开发人员在强制PDF下载时使用 foreach (var item in g) { db.Set<Grade>().Attach(item); db.Entry<Grade>(item).State = EntityState.Modified; db.Configuration.ValidateOnSaveEnabled = false; } db.SaveChanges(); 更改了一行代码,使用HttpResponse.End以类似的方式下载: https://stackoverflow.com/a/8590579/3856039

这样做导致某些PDF由于不间断的空间问题而无法下载,因此代码已更改回使用HttpApplication.CompleteRequest

然而,在帮助我的同事进行一些研究时,我遇到了以下问题: Is Response.End() considered harmful?

链接到: https://blogs.msdn.microsoft.com/aspnetue/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation/

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

2 个答案:

答案 0 :(得分:1)

以下是Response.End的实际代码:

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()之后没有代码。如果可以避免异常,最好不要抛出异常,因为它(像所有异常一样)会导致堆栈展开和一些性能开销。

也许您可以编写自己的Response.End版本并选择实际执行的代码行,例如:也许你想要刷新缓冲区并调用CompleteRequest,但你不想抛出异常。

答案 1 :(得分:0)

以下是我过去使用的方法

// 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();