在WebMethod中没有正确捕获ThreadAbortException

时间:2016-11-24 15:05:09

标签: c# jquery asp.net ajax webmethod

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

问题是我在重定向之前有大量的代码,并且是用一个集中式方法编写的(只有在重定向之前调用的方法才能执行相同的操作。)在我的重定向中,我也必须调用该函数。 / p>

我只是将我的代码放在这里而不需要调用集中式函数来更好地理解。

    [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";
        }

    }

作为回应我收到Internal Server Error (505) System.Threading.ThreadAbortException而不是像catch块一样返回“Exception”。

其他例外不是这种情况,即如果我用{/ p>之类的东西替换Response.Redirect

int i = 0;
int j = 5/i;

它也会引发异常,但不会给我Internal Server Error (505),而是返回“Excetion”,即从catch块返回字符串。

我的问题是

  1. 为什么以不同于其他例外的方式处理System.Threading.ThreadAbortException
  2. 我知道其他一些工作,比如函数加载和Centralized函数中使用的可选参数,通过检查附加参数我可以返回字符串而不是重定向但是我想知道是否有什么我可以使用在webmethod或任何其他地方,没有触及集中功能,以使其工作?

1 个答案:

答案 0 :(得分:1)

  

为什么它以不同方式处理System.Threading.ThreadAbortException   来自其他例外?

关于第一个问题,请访问MSDN上的ThreadAbortException

  

ThreadAbortException是特殊例外可以被捕获但是它   将在catch块结束时再次自动引发。什么时候   引发此异常,运行时执行所有finally块   在结束线程之前。因为线程可以做无界限   在finally块中计算或调用Thread.ResetAbort来取消   中止,无法保证线程永远不会结束。如果你   想要等到中止的线程结束,你可以调用   Thread.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 METHOD中使用Response.Redirect不是一个好习惯!当您使用WEB METHOD时,您应该遵循SOAP规则。您需要知道致电Response.Redirect会致电Response.End

MSDN上的

HttpResponse.Redirect Method页:

  

绝对网址(例如,http://www.contoso.com/default.aspx)或   可以为。指定相对URL(例如,default.aspx)   目标位置,但某些浏览器可能会拒绝相对URL。的重定向   调用End引发ThreadAbortException异常   完成。