2016-11-24 5 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 вместо возвращения «Exception», как и в блоке улова.

Это не в случае с другими исключениями, то есть, если я заменю Response.Redirect что-то вроде

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

Это также вызывает исключение, но не дает мне Internal Server Error (505), вместо того, чтобы вернуться «Excetion», то есть возвращается строка из улова блок.

Мои вопросы

  1. Почему это лечение System.Threading.ThreadAbortException отличается от других исключений?
  2. Я знаю, что другая работа вокруг как функция по загрузке и дополнительные параметры, которые будут использоваться в функции Centralized, и, проверяя дополнительный параметр, я могу вернуть строку вместо перенаправления, но я хочу знать, есть ли что-нибудь, что я могу использовать внутри webmethod или любой в другом месте, не касаясь централизованной функции, чтобы заставить ее работать?

ответ

1

Почему это лечение System.Threading.ThreadAbortException по-разному от других исключений?

Для вашего первого вопроса, От ThreadAbortException на MSDN:

ThreadAbortException является специального исключения, что может быть перехвачен, но автоматически будет вновь поднят в конце catch блок. Когда возбуждено это исключение, среда выполнения выполняет все блоки finally перед завершением потока. Поскольку поток может выполнить неограниченное вычисление в блоках finally или вызвать Thread.ResetAbort, чтобы отменить прерывание, нет гарантии, что нить никогда не закончится. Если вы хотите подождать, пока закончится прерванная нить, вы можете вызвать метод Thread.Join . Join - это блокирующий вызов, который не возвращается до , поток фактически прекращает выполнение.

Я думаю, что для предотвращения этого вам необходимо позвонить Thread.ResetAbort() в блок 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"; 
    } 

} 

И с использованием ответа.Перенаправление в WEB METHOD не является хорошей практикой! Когда вы используете WEB METHOD, вы должны следовать правилам SOAP. И вам нужно знать, что вызов Response.Redirect вызовет Response.End.

HttpResponse.Redirect Method страница на MSDN:

Абсолютного URL-адрес (например, http://www.contoso.com/default.aspx) или относительный URL-адрес (например, default.aspx) может быть задана для целевого местоположения, но некоторые браузеры могут отвергнуть относительный URL. Переадресация вызывает Конец, который вызывает исключение ThreadAbortException после завершение.

+0

Ошибка 'Authentication failed' на консоли после использования' Thread.ResetAbort' – Imad

+0

@Imad Поверьте мне, использование 'HttpRedirect' на самом деле не является хорошей практикой. Я предлагаю вам не делать этого. –

+0

Согласился на это долго назад. хотел еще * попробовать * его. – Imad