这篇知识库文章说,ASP.NET Response.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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很苛刻.正如知识库文章所说,以下应用程序中的任何代码Response.End()都不会被执行,这违反了最不惊讶的原则.它几乎就像Application.Exit()在WinForms应用程序中.造成线程终止异常Response.End()不开捕,所以代码周围的try...... finally不会满足.
这让我想知道我是否应该总是避免Response.End().
任何人都可以建议,我什么时候应该使用Response.End(),何时Response.Close()何地HttpContext.Current.ApplicationInstance.CompleteRequest()?
参考:Rick Strahl的博客文章.
根据我收到的输入,我的回答是,是的,Response.End是有害的,但在某些有限的情况下它是有用的.
Response.End()作为一个不可捕获抛出,立即终止HttpResponse在特殊的条件.在调试过程中也很有用. 避免Response.End()完成常规反应.Response.Close()立即关闭与客户端的连接.根据此MSDN博客文章,此方法不适用于正常的HTTP请求处理. 你不太可能有充分的理由来调用这种方法.所以我知道你不应该使用
Thread.Abort()
Run Code Online (Sandbox Code Playgroud)
但我从未得到过很好的解释.是否存在性能损失或隐藏的问题?
我知道你不能忽略/吞下ThreadAbortException(这是有道理的)
System.Threading.ThreadAbortException:线程正在中止.
在System.Threading.Thread.AbortInternal()处于System.Web.HttpResponse.End()的System.Threading.Thread.Abort(Object stateInfo)处System.Web.HttpResponse.Redirect(String url,Boolean endResponse)
. taxi.HttpResponse.Redirect(String url)at taxi_selection.lnkbtnconfirm_Click(Object sender,EventArgs e)
我发现解决方案就是这样
的Response.Redirect( "home.aspx",假); 但是这个错误再次发生.
对此有什么好的解决方案?
我的代码片段:
Response.Redirect("home.aspx",false);
Run Code Online (Sandbox Code Playgroud) 我正在使用ASP身份验证和集成的Web服务.
用户在登录页面上使用Forms身份验证登录.
要注销,我从Silverlight调用身份验证Web服务并调用logout.
一切都运行正常,但现在有时IE变得疯狂,不再登出用户.
我使用了Fiddler,事实证明,身份验证服务返回一个SetCookie来清除ASPXAUTH cookie,但在下一次调用时,IE仍然设置了cookie.
所以当然因为cookie在那里用户经过身份验证并重新登录而不是被定向到登录页面.
我检查过,没有看到任何其他问题的描述.我无法重现它,我的同事有一个行为不端的IE使它在一个环境中工作正常,而在另一个环境中没有(一个有DEV的问题而另一个有PreProd服务器的问题).
知道可能会发生什么吗?
Response.End()生成ThreadAbortException.
用HttpContext.Current.ApplicationInstance.CompleteRequest它代替它并不能解决问题.
那么,我们可以使用Response.Flush()而不是Response.End()