首页 新闻 会员 周边 捐助

一般处理程序context.Response.End()执行时抛异常

0
悬赏园豆:50 [已解决问题] 解决于 2014-02-08 10:24

以前一直以为一般处理程序在执行方法完成之后执行context.Response.End();能提高性能,因为再之前已经把内容context.Response.Write()完了,end之后肯定会减少执行过程,但是今天在ProcessRequest方法内try|catch的时候如果在try内部执行context.Response.End();就会出现异常,调试的时候还会出现 {由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。}错误异常,我想既然出现异常了是不是就会影响性能,那之前的end是不是要都改过来。。。。求大神解答

tongling的主页 tongling | 初学一级 | 园豆:30
提问于:2014-02-07 17:06
< >
分享
最佳答案
1

response.End方法结束执行页,并将执行切换到应用程序的事件管道中的Application_EndRequest事件。Response.End之后的代码行不会被执行。

因为这两种方法都会内部调用Response.EndResponse.RedirectServer.Transfer方法中发生此问题。

收获园豆:50
YoMe | 小虾三级 |园豆:545 | 2014-02-08 09:14

我是说在对Response.End进行try|catch的时候竟然能够捕获异常,这是为什么,为什么会发生异常,而且异常信息也太少了,求大神解答。。。

tongling | 园豆:30 (初学一级) | 2014-02-08 09:27

@那一年的码农: 

异常信息如下,"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"。

我的开发环境Win7+Vs2010+开发框架 ASP.NET MVC 3.0,在View中点击Button按钮,执行js脚本Ajax调用SubmitAcceptOrder.ashx文件,

context.Response.Write();将一个字符串写入Http响应输出流

context.Response.End();将当前所有缓冲的输出发送到客户端,停止该页的执行,并引发System.Web.HttpApplication.EndRequest事件。

     根据个人经验,在Aspx页面中利用Ajax调用ashx文件,都是使用Response.Write();Response.End()方法输出到客户端。也从没遇到这样的问题。但是在ASP.NET MVC 3.0框架中不知道为什么会出现这样的错误。网上查询了下,以下是个人理解。

     1:Response.End()的调用在当前响应提前结束时会引发一个ThreadAbortException。Response.End 方法停止页的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件,Response.End 后面的代码行将不执行。

对应的解决方案是,调用 ApplicationInstance.CompleteRequest 方法而不调用 Response.End,以便跳过 Application_EndRequest 事件的代码执行。但是调试发现,即使调用了ApplicationInstance.CompleteRequest 方法,该方法之后的代码依然会执行。所以我在ApplicationInstance.CompleteRequest 方法后加上了return。终止程序的执行。

     同时对于Response.Redirect,Server.Transfer也会有这些类似的异常。因为他们内部都调用了Response.End 。他们对应的解决方案是:

     2:对于Response.Redirect:使用重载 Response.Redirect(String url, bool endResponse),对 endResponse 参数它传递 false以取消对 Response.End 的内部调用。例如: 
Response.Redirect ("nextpage.aspx", false);

这时,Response.Redirect 后面的代码依然会执行。你可以加上Return终止程序的执行了。

YoMe | 园豆:545 (小虾三级) | 2014-02-08 09:33

@那一年的码农: try { Context.Response.End(); } catch (ThreadAbortException err) { } catch (Exception err) { }

YoMe | 园豆:545 (小虾三级) | 2014-02-08 09:36

@Yowe: 大神高见,那依您之见在ProcessRequest方法运行的最后执行 context.ApplicationInstance.CompleteRequest();return;是不是会提升一些性能呐?

tongling | 园豆:30 (初学一级) | 2014-02-08 10:00

@那一年的码农: 是的

YoMe | 园豆:545 (小虾三级) | 2014-02-08 10:02

@Yowe: ok 多谢大神指教

tongling | 园豆:30 (初学一级) | 2014-02-08 10:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册