神马的 Response.End
昨晚团队项目上线,下班之前提交了下面一段代码,outPut在程序中已定义好,是个字符串值。
context.Response.Write(outPut);
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终止程序的执行了。
3:对于 Server.Transfer:改用 Server.Execute 方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2010-05-24 铭记周末