首页 新闻 会员 周边

微软MSDN忽悠人吗?神马的HttpApplication.CompleteRequest

0
悬赏园豆:20 [已关闭问题] 关闭于 2012-02-27 11:18

使用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;

}

我晕呀,难道是我理解错了,还是?!

请兄弟姐妹赐教呀!!!

边缘程序员2011的主页 边缘程序员2011 | 初学一级 | 园豆:38
提问于:2012-02-23 17:09
< >
分享
所有回答(1)
2

你理解错了,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了。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-02-23 17:32

如果这样,HttpApplication.CompleteRequest根本替代不了Response.End的作用。用Response.End的目的就是停止页面执行的,既然HttpApplication.CompleteRequest达不到这种效果,微软还说可以替代,真不理解呀!

支持(0) 反对(0) 边缘程序员2011 | 园豆:38 (初学一级) | 2012-02-24 11:46

@边缘程序员2011: 看这段代码:

void Page_Load()
{
CompleteRequest();
//你能在CompleteRequest里写一段代码,让下面的代码不执行同时又没有异常吗
int a = 0;
}

void CompleteRequest()
{
//???
}

框架代码也是代码,不能违背语言原则的。

支持(3) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2012-02-24 12:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册