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