Response.End,Resonse.Rediect,Server.transfer执行后会报异常(由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值)的问题解决方案...

今天做东西,从服务器上将文件response.write出来,但是我怕下载的过程出异常,就对下载的代码加了try/catch,结果文件都已经下再下来了,但是程序却执行到catch里面了,爆出了ThreadAbortException异常,虽说没什么影响,但是自己感觉像吃了苍蝇,很是不爽。晚上琢磨了一下,搞明白了,总结如下:

先看几段代码:

Response.End():

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
protected void Page_Load( object sender, EventArgs e)
{
try
{
Response.Write(
" Default " );
Response.End();
}
catch (Exception ex)
{
int i = 0 ;
}

}

Response.Redirect():

 

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
protected void Page_Load( object sender, EventArgs e)
{
try
{
Response.Redirect(
" Hello.aspx " );
}
catch (Exception ex)
{
int i = 0 ;
}
}

 

 

上面这连段段代码中catch块一直会执行,异常信息为“Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack(由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值)”

很是奇怪,上面的代码没什么问题,但是就是会报异常,如果不加catch,程序也不会报错。

看下面代码:

 


  
protected void Page_Load( object sender, EventArgs e)
{

Response.Write(
" Default " );
Response.End();
int i = 0 ;
}

 

上面这段代码压根int i=0压根就不会执行,这是为什么?

今天这个问题困扰了我大半天,今晚终于找到问题的原因了:

Response.End()会终止页面代码的执行,而直接转向Application_EndRequest事件,Response.End()后面的代码是不会执行的。而Response。Redirect()方法最后也会执行Response.End()。所以当其后还有代码时,CLR就会爆出ThreadAbortException。这就是上面问题的产生原因。

那么这些问题应该怎么解决呢?

微软指出:用HttpContext.Current.ApplicationInstance.CompleteRequest 方法来代替Response.End,用

 Response。Redirect(url,false)来代替Response。Redirect(url).

现在上面的代码可以这样子写:

Response.End();

ContractedBlock.gif ExpandedBlockStart.gif 代码

   

protected void Page_Load( object sender, EventArgs e)
{
try
{
Response.Write(
" Default " );
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
catch (Exception ex)
{
int i = 0 ;
}
}

 

 

Response.Redirect()

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
protected void Page_Load( object sender, EventArgs e)
{
try
{
Response.Redirect(
" Hello.aspx " , false );
}
catch (Exception ex)
{
int i = 0 ;
}
}

经过上面的修改两段代码中catch都不会再执行。问题总算解决了,终于把苍蝇吐出来了

另外Server.Transfer也会在执行完毕之后内部也会执行Response.End,微软建议如果有类似情况,可以用

Server.Execute来代替之。

【参考1】:http://support.microsoft.com/kb/312629/EN-US/#top

【参考2】:http://forums.asp.net/t/984756.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值