2016-11-24 62 views
1

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

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

我只是把我的代码放在这里,不用调用集中的函数来更好的理解。

[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块。

这是不是与其他异常,即情况下,如果我喜欢的东西

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

这也提出了异常,但并没有给我Internal Server Error (505)更换Response.Redirect,而不是返回“EXCETION”,即从捕捞返回的字符串块。

我的问题是

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

回答

1

为什么它是从其他异常处理System.Threading.ThreadAbortException不同 ?

关于第一个问题,从ThreadAbortException MSDN上:

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

HttpResponse.Redirect Method页在MSDN:(例如,http://www.contoso.com/default.aspx

绝对URL或 相对URL(例如,Default.aspx的)可以被用于 目标位置指定,但一些浏览器可能拒绝一个相对URL。 重定向 调用End完成后,引发ThreadAbortException异常

+0

在使用'Thread.ResetAbort'后在控制台上给出'Authentication failed'错误 – Imad

+0

@Imad相信我,使用'HttpRedirect'并不是一个好的做法。我建议你不要这样做。 –

+0

早就答应了。想要仍然*尝试*它。 – Imad