URLにリダイレクトしたいのですが、失敗した場合は通知されます。
私の知る限り、リダイレクトは常に例外をスローするため、単純なtry-catchブロックはここでは機能しません。その例外(ThreadAbortException)をチェックすることはできますが、これが最善の方法ですか?
編集:特定のURLにリダイレクトしようとしていますが、存在しない場合は別のURLにリダイレクトします。
リダイレクトはクライアント側の操作であるため(サーバーはコード302とヘッダーをリダイレクト先に設定して応答を送信するだけです)、サーバー側の呼び出しがクライアントでリダイレクトが成功したかどうか(またはそれが続く場合でも)を示すlocation
ことは期待できません。Request.Redirect
あなたのオプション:
残念ながら、宛先ページが存在するかどうかを確認するためのすべてのサーバー側オプションには、重大な欠点があります。
このコードが賞を獲得することはないと思いますが、これは少なくとも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
}
さて、これは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;
}
}
}