2016-11-24 8 views
1

WebMethodからリダイレクトする必要があります。だから私はちょうど文字列としてページURLを返そうとしており、successコールバックでリダイレクトされます。WebMethodでThreadAbortExceptionが正しくキャッチされていません

問題点リダイレクトする前に膨大な量のコードがあり、それは1つの集中化されたメソッド(前に同じ操作を実行するためにリダイレクトする前に呼び出されるメソッドのみ)で記述されます。リダイレクトでもその関数を呼び出す必要があります。

ここでは、わかりやすい集中機能を呼び出すことなく、ここに自分のコードを入れています。応答で

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

    } 

は私の代わりにcatchブロックのように「例外」を返すのでSystem.Threading.ThreadAbortExceptionInternal Server Error (505)を取得しています。私が代わりにすなわち「Excetion」を返すキャッチから文字列を返し、

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

また、例外を発生させますが、私にInternal Server Error (505)を与えるものではありませんのようなものでResponse.Redirectを置き換える場合

これは他の例外、すなわちの場合ではありませんブロック。それは他の例外とは異なるSystem.Threading.ThreadAbortExceptionを扱っているのはなぜ

私の質問は

  1. ですか?
  2. 私はCentralized関数で使用されるローディング関数とオプションパラメータのような別の関数を知っています。追加パラメータをチェックすることでリダイレクトの代わりに文字列を返すことができますが、webmethodやany集中化された機能に触れることなく、他の場所で機能させることができますか?

答えて

1

それは違っ 他の例外からSystem.Threading.ThreadAbortExceptionを扱っているのはなぜ? MSDNのThreadAbortExceptionから、あなたの最初の質問については

、:

ThreadAbortExceptionのはをキャッチすることができますが、それは が自動的にの終わりに再び上昇されることを特別な例外ですキャッチブロック。 この例外が発生すると、スレッドはスレッドを終了する前にすべてのfinallyブロック を実行します。スレッドはfinallyブロック内の無限の 計算を実行するか、またはスレッドを終了させるためにThread.ResetAbortを呼び出すことができるので、スレッドが終了する保証はありません。 が中止されたスレッドが終了するまで待つ場合は、 Thread.Joinメソッドを呼び出すことができます。結合は、スレッドが実際に実行を停止するまで まで戻らないブロッキング呼び出しです。

キャッチブロックで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.RedirectResponse.Endに電話することを知る必要があります。 MSDNで

HttpResponse.Redirect Methodページ:

(例えば、http://www.contoso.com/default.aspx)絶対URLまたは 相対URL(例えば、Default.aspxの) 目標位置に指定することができるが、いくつかのブラウザが拒否することができます相対URL リダイレクト ThreadAbortException例外を発生させるEndを呼び出します。を 完了時に呼び出します。

+0

'Thread.ResetAbort'を使用した後、コンソールで' Authentication failed'エラーを返します。 – Imad

+0

@Imad Trust me、 'HttpRedirect'を使うのは良い方法ではありません。私はあなたにそれをすることをお勧めします。 –

+0

それは長らく同意した。まだ試してみたかった*。 – Imad

関連する問題