项目中使用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的方法中发生此问题。
官文文档中还有另外一种解放方法:
若要变通解决此问题,请使用下列方法之一:
作者:十有三
出处:https://shiyousan.com/post/635380456808035953
版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。