C# WebMethod中未正确捕获ThreadAbortException

C# WebMethod中未正确捕获ThreadAbortException,c#,jquery,asp.net,ajax,webmethod,C#,Jquery,Asp.net,Ajax,Webmethod,我必须从WebMethod重定向,我知道我不能。所以我只是尝试以字符串形式返回页面url,并将在successcallback中重定向 问题是在重定向之前,我有大量的代码,这些代码都写在一个集中的方法中(唯一在重定向之前调用以执行相同操作的方法)。在重定向中,我还必须调用该函数 我只是把我的代码放在这里,没有调用集中式函数来更好地理解 [WebMethod] [ScriptMethod(UseHttpGet = true)] public static string Te

我必须从
WebMethod
重定向,我知道我不能。所以我只是尝试以字符串形式返回页面url,并将在
success
callback中重定向

问题是在重定向之前,我有大量的代码,这些代码都写在一个集中的方法中(唯一在重定向之前调用以执行相同操作的方法)。在重定向中,我还必须调用该函数

我只是把我的代码放在这里,没有调用集中式函数来更好地理解

    [WebMethod]
    [ScriptMethod(UseHttpGet = true)]
    public static string TestException()
    {
        try
        {
            System.Web.HttpContext.Current.Response.Redirect("Test.aspx");
            return "No Exception";
        }
        catch(Exception ex)
        {
            return "Exception";
        }

    }
作为响应,我得到了
内部服务器错误(505)
System.Threading.ThreadAbortException
,而不是像catch块那样返回“Exception”

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string TestException()
{
    try
    {
        System.Web.HttpContext.Current.Response.Redirect("Test.aspx");
        return "No Exception";
    }
    catch(ThreadAbortException ex)
    {
        Thread.ResetAbort();
        return "Exception";
    }

}
其他例外情况并非如此,即如果我将
Response.Redirect
替换为

int i = 0;
int j = 5/i;
它也会引发异常,但不会给我
内部服务器错误(505)
,而是返回“exception”,即从catch块返回的字符串

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string TestException()
{
    try
    {
        System.Web.HttpContext.Current.Response.Redirect("Test.aspx");
        return "No Exception";
    }
    catch(ThreadAbortException ex)
    {
        Thread.ResetAbort();
        return "Exception";
    }

}
我的问题是

  • 为什么它将
    System.Threading.ThreadAbortException
    与其他异常区别对待
  • 我知道其他解决方法,如函数重载和可选参数,用于
    集中式
    函数,通过检查其他参数,我可以返回字符串而不是重定向,但我想知道是否有任何东西可以在webmethod或任何其他地方使用,而无需触摸集中式函数即可获得工作
  • 为什么它以不同的方式处理System.Threading.ThreadAbortException 是否有其他例外

    关于您的第一个问题,请参见MSDN:

    ThreadAbortException是一个特殊异常,可以捕获但它 将在挡块末端再次自动升起。什么时候 引发此异常时,运行库将执行所有finally块 在结束线程之前。因为线程可以执行无界 finally块中的计算或调用Thread.ResetAbort以取消 中止后,无法保证线程将永远结束。如果你 要等待中止的线程结束,可以调用 连接方法。Join是一个阻塞调用,直到 线程实际上停止执行

    我认为要防止这种情况,需要在catch块中调用
    Thread.ResetAbort()

    [WebMethod]
    [ScriptMethod(UseHttpGet = true)]
    public static string TestException()
    {
        try
        {
            System.Web.HttpContext.Current.Response.Redirect("Test.aspx");
            return "No Exception";
        }
        catch(ThreadAbortException ex)
        {
            Thread.ResetAbort();
            return "Exception";
        }
    
    }
    
    WEB方法中使用Response.Redirect
    不是一个好做法!使用
    WEB方法时
    应遵循
    SOAP
    规则。您需要知道调用
    响应。重定向将调用
    Response.End

    MSDN第页:

    绝对URL(例如)或 可以为 目标位置,但某些浏览器可能拒绝相对URL重定向 调用End,在调用时引发ThreadAbortException异常 完成


    使用
    线程后,控制台上的Give
    身份验证失败
    错误。ResetAbort
    @Imad信任我,使用
    HttpRedirect
    并不是一个好做法。我建议你不要这样做。很久以前就同意了。我还想试试,它不起作用。我接受了它,因为我觉得这是一个很好的解释。如果这是一个坏习惯,那么什么是好习惯?您能否提供一个重定向遵循SOAP规则的示例?