1

URLにリダイレクトしたいのですが、失敗した場合は通知されます。

私の知る限り、リダイレクトは常に例外をスローするため、単純なtry-catchブロックはここでは機能しません。その例外(ThreadAbortException)をチェックすることはできますが、これが最善の方法ですか?

編集:特定のURLにリダイレクトしようとしていますが、存在しない場合は別のURLにリダイレクトします。

4

3 に答える 3

4

リダイレクトはクライアント側の操作であるため(サーバーはコード302とヘッダーをリダイレクト先に設定して応答を送信するだけです)、サーバー側の呼び出しがクライアントでリダイレクトが成功したかどうか(またはそれが続く場合でも)を示すlocationことは期待できません。Request.Redirect

あなたのオプション:

  • ただそれと一緒に暮らす
  • リダイレクトがローカルの場合、少なくともローカルパスが存在するかどうか(またはMVCを使用しているかどうか-指定されたパラメーターを持つルートが定義されているかどうか)を確認できます。
  • リダイレクトがリモートの場合は、最初にサーバーでリクエストを発行して、応答が妥当かどうかを確認できます(「404ではない」など)。

残念ながら、宛先ページが存在するかどうかを確認するためのすべてのサーバー側オプションには、重大な欠点があります。

  • URLのチェックは潜在的に遅い操作です
  • 遠隔地のページに認証情報/クックを渡すことはできません
  • 一部のサーバーは、「ページは実際には存在しません。別の場所を探してください」と200で応答します。
于 2012-12-09T20:23:55.450 に答える
2

このコードが賞を獲得することはないと思いますが、これは少なくともThreadAbortExceptionを防ぎます...

KBの記事に触発されました

bool redirectOK = false;
try
{
  Repsonse.Redirect(url, false);
  redirectOK = true;
}
catch(Exception exp)
{
   // log/handle/whatever
}
if (redirectOK)
{
 // do what even you want for a serverside succeeded redirect
}
else
{
  // do what ever you want for a failure to redirect
}
于 2012-12-09T19:40:08.927 に答える
0

さて、これは404エラーをチェックし、エラーがない場合はページに直接移動します。

if URLExists(theURL){
Response.Redirect(theUrl);
}
else{
//redirect somewhere else
}


public static bool UrlExists(string url)
        {
            try
            {
                if (url == "")
                {
                    return false;
                }
                else
                {
                    new System.Net.WebClient().DownloadData(url);
                    return true;
                }
            }
            catch (System.Net.WebException e)
            {
                try
                {
                    if (((System.Net.HttpWebResponse)e.Response).StatusCode == System.Net.HttpStatusCode.NotFound)
                        return false;
                    else
                        throw;
                }
                catch
                {
                    return false;
                }
            }
        }
于 2013-01-20T04:24:10.370 に答える