使用Response.End,程序出错,抛出ThreadAbortException异常,写asp的时候没这种鸟事。百度之后,找到微软MSDN解释:Response.End()的调用在当前响应提前结束时会引发一个ThreadAbortException。Response.End 方法停止页的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件,Response.End 后面的代码行将不执行。
对应的解决方案是,调用 ApplicationInstance.CompleteRequest 方法而不调用 Response.End,以便跳过 Application_EndRequest 事件的代码执行。但是调试发现,即使调用了ApplicationInstance.CompleteRequest 方法,该方法之后的代码依然会执行。我的代码很简单,如下:
protected void Page_Load(object sender, EventArgs e)
{
var obj = new { Name="张三",Sex="男" };
Response.Write("姓名:"+obj.Name);
HttpContext.Current.ApplicationInstance.CompleteRequest();
//下面两行依然照旧执行,根本没有跳到EndRequest
Response.Write("123");
int a = 0;
}
我晕呀,难道是我理解错了,还是?!
请兄弟姐妹赐教呀!!!
你理解错了,HttpApplication.CompleteRequest的作用是:使 ASP.NET 跳过 HTTP 执行管线链中的所有事件和筛选并直接执行EndRequest事件。假设本来的流程是:BeginRequest -> aaa -> bbb -> Page_Load -> ccc -> ddd -> EndRequest。 你在Page_Load中调用CompleteRequest会使Page_Load完成后跳过ccc和ddd,直接进入EndRequest,而不是连Page_Load都没执行完就跳到EndRequest了。
如果这样,HttpApplication.CompleteRequest根本替代不了Response.End的作用。用Response.End的目的就是停止页面执行的,既然HttpApplication.CompleteRequest达不到这种效果,微软还说可以替代,真不理解呀!
@边缘程序员2011: 看这段代码:
void Page_Load()
{
CompleteRequest();
//你能在CompleteRequest里写一段代码,让下面的代码不执行同时又没有异常吗
int a = 0;
}
void CompleteRequest()
{
//???
}
框架代码也是代码,不能违背语言原则的。