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

@那一年的码农:

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

我的开发环境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终止程序的执行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值