最近我们遇到了一个问题,其中一位开发人员在强制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?
鉴于MSDN博客文章中记录的内容,听起来好像使用HttpResponse.End
是错误的方法,所以我想知道是否需要它或是否有更好的方法?
答案 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();