/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

解决asp.net中 jquery ajax调用一般处理程序ashx出现"正在中止线程"异常

2014-06-11 十有三 0 浏览:1万+ .NET技术 异常处理

项目中使用JQuery Ajax调用ashx一般处理程序的时候出现无法获取数据的问题,经排查是由于AJAX发送请求引发了ThreadAbortException异常,提示的错误信息是“正在中止线程”。

 

引发该异常的原因是由于ajax调用一般处理程序.ashx获取数据时,在public void ProcessRequest(HttpContext context)方法中使用了try catch的异常捕获,并且还使用context.Response.End(),最终导致线程出现中止。这个异常在调试中可能显示不出来,只会提示这个信息:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。 

出现错误的代码如下,大家可以在程序上测试下:

ajax代码:

<scirpt  type="text/javascript">
 $(function () {
$.ajax({
        type: "GET",
        url: "/Ajax/test.ashx",        
        async: false,
        success: function (data) {alert(data);},
        error: function (ex) {alert(ex.error);}
    });
});
</script>

ashx 一般处理程序代码:

public void ProcessRequest(HttpContext context)
        {            
            try
            {                 
                context.Response.Write("执行成功");
                context.Response.End();
            }
            catch (ThreadAbortException tae)
            {
                //这里提示正在中止线程
                context.Response.Write(tae.Message);
                context.Response.End();
            }
            catch (Exception ex)
            {                                
                context.Response.Write(ex.Message);
                context.Response.End();
            }            
        }

解决思路有两个:

1、不要在try catch中使用context.Response.End(),在finally中或者放置在try catch外使用。 

public void ProcessRequest(HttpContext context)
        {
            try
            {
                context.Response.Write("执行成功");
            }
            catch (ThreadAbortException tae)
            {             
                context.Response.Write(tae.Message);
            }
            catch (Exception ex)
            {
                context.Response.Write(ex.Message);
            }
            finally
            {
                //将context.Response.End()移至到finally中使用
                //或者在try catch外使用
                context.Response.End();
            }
        }

2、不要使用try catch,将逻辑代码放置在BLL业务逻辑层中。 


另外出现此问题是由于ASP.NET 设计上的问题,具体可查看微软官方对于此问题的描述:ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer (点击此处为中文翻译链接)

 

我们可以从中发现,不仅仅是Response.End会引发这个问题,Response.Redirect和Server.Transfer方法也会引发该问题。文章中说造成这种原因是由于:

Response.End方法结束执行页,并将执行切换到应用程序的事件管道中的Application_EndRequest事件。Response.End之后的代码行不会被执行。因为这两种方法都会内部调用Response.End , Response.Redirect和Server.Transfer的方法中发生此问题。


官文文档中还有另外一种解放方法:

若要变通解决此问题,请使用下列方法之一:

  • 对于Response.End,调用HttpContext.Current.ApplicationInstance.CompleteRequest方法,而不是Response.End能够绕过到Application_EndRequest事件的代码执行。
  • 对于Response.Redirect,使用重载,传递false以取消内部调用Response.End的endResponse参数的Response.Redirect (url 字符串、 布尔值 endResponse) 。
    • 例如:Response.Redirect ("nextpage.aspx", false);
    • 如果您使用此替代方法,遵循Response.Redirect的代码执行。
  • 对于Server.Transfer,而是使用Server.Execute方法。

作者:十有三

出处:https://shiyousan.com/post/635380456808035953

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: CKEditor 4.4.1 添加代码高亮显示插件功能--使用官方推荐Code Snippet插件
  • 下一篇: ASP.NET MVC 表单提交多层子级实体集合数据到控制器中

相关文章
  • Web 部署任务失败 未能使用指定的进程“Web Management Service”连接到远程计算机
  • JSON劫持漏洞(详细讲解利用JSON从而进行数据劫持的漏洞攻防策略)
  • VS(Visual Studio)按键失灵无法按回车
  • 解决Visual Studio 起始页中"最近的项目"没有记录最近使用的项目和解决方案
  • 网站打开出现 Server Error in '/' Application Validation of viewstate MAC failed
  • Visual Studio 2013 社区版和速成版之间的区别

文章分类

.NET技术 123 数据库 24 Web前端 21 网站建设运维 37 操作系统与应用 66 程序猿日常 11 开发工具 12 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 服务器 搞笑娱乐 好文分享 软件应用 生活知识 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • 只允许一个 <configSections> 元素。它必须是根 <configuration> 元素的第一个子元素- HTTP Error 500.19
  • 阿里云一台ECS如何绑定多个独立公网IP?利用负载均衡实现!
  • 解决特殊字符引发的错误:应用程序配置文件"App.config/Web.config"无效。分析EntityName时出错
  • ASP.NET MVC如何实现带www域名重定向到不带www顶级域名
  • 解决Visual Studio 起始页中"最近的项目"没有记录最近使用的项目和解决方案

友情链接

  • Passingwind的博客
  • 码友网

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号
闽公网安备 35020302035102号