C# “ASP.NET例外情况”;“线程正在中止”;导致方法退出
在下面的代码中,有时C# “ASP.NET例外情况”;“线程正在中止”;导致方法退出,c#,.net,asp.net,C#,.net,Asp.net,在下面的代码中,有时someFunctionCall()会生成异常: 线程正在中止 为什么代码块B中的代码从不运行?ASP.NET是否为每个方法调用启动一个新线程?我惊讶地发现,当这个异常发生时,块B中的代码从未运行,方法返回,我的应用程序继续运行。有人能解释一下吗 public void method() { // CODE BLOCK A //... try { someFunctionCall(); // this ca
someFunctionCall()
会生成异常:
线程正在中止
为什么代码块B中的代码从不运行?ASP.NET是否为每个方法调用启动一个新线程?我惊讶地发现,当这个异常发生时,块B中的代码从未运行,方法返回,我的应用程序继续运行。有人能解释一下吗
public void method()
{
// CODE BLOCK A
//...
try
{
someFunctionCall(); // this call is generating thread abort exception
}
catch(Exception ex)
{
// log exception message
}
// CODE BLOCK B
// ...
}
这是一个
ThreadAbortException
;这是一个特殊的异常,在每个catch块结束时自动重新调用,除非调用Thread.ResetAbort()
ASP.Net方法,如Response.End
或Response.Redirect
(除非传递false
),会将此异常抛出到当前页面的结束处理;您的someFunctionCall()
可能正在调用这些方法之一
ASP.Net本身处理此异常,并调用ResetAbort
以继续处理。请尝试以下方法:
这是我的扩展方法:
public static void WriteJSONObject(this HttpResponse response, object content) {
response.ContentType = "application/json";
response.Write(new JavaScriptSerializer().Serialize(content));
response.End();
}
和逻辑:
public void RegisterUser() {
try {
Response.WriteJSONObject(new { Result = "See hello" });
}
catch (Exception err) {
if (err.Message != "Thread was being aborted.")
Response.WriteJSONObject(new { Result = err.Message });
else {
Response.End();
}
}
}
要解决此问题,请使用以下方法之一: 对于
Response.End
,调用HttpContext.Current.ApplicationInstance.CompleteRequest
方法,而不是Response.End
,以绕过对应用程序EndRequest
事件的代码执行
对于Response.Redirect
,使用重载Response.Redirect(字符串url,bool endResponse)
,该重载为endResponse
参数传递false,以抑制对Response.End
的内部调用。例如:
Response.Redirect ("nextpage.aspx", false);
如果使用此解决方法,将执行Response.Redirect
后面的代码。
对于
Server.Transfer
,请使用Server.Execute
方法。对我有效的方法是增加IIS上应用程序池的“空闲超时(分钟)”属性
我将其设置为“43200”,这是最大值
我还调整了回收设置…那么我如何让它忽略该异常并继续执行块B中的代码呢?你确定要吗?如果someFunctionCall正在重定向或结束响应,您可能不应该继续它someFunctionCall的作用是什么?它会向第三方供应商发出XML-RPC调用。无响应结束或重拨。如果它是XML-RPC API的旧版本,我希望忽略它并继续使用默认值。在catch块中调用Thread.ResetAbort。另外,询问供应商例外情况是什么。异常的堆栈跟踪是什么?这是错误的。您不应该将异常的
消息
与硬编码字符串进行比较。相反,您可以编写catch(ThreadAbortException){}catch(Exception ex){…}
。另外,如果已经存在ThreadAbortException
,那么调用Response.End
也没有意义。另外:上述解决方案对我来说不像大多数人那样有效。不管我做了什么都没用,所以这是我找到的唯一解决方案,效果很好;我是说这是个可怕的主意。您的代码正在解决与此问题无关的另一个问题。