1

我想重定向到一个 url,但如果它失败了会被通知。

据我所知,一个简单的 try-catch 块在这里不起作用,因为重定向总是抛出异常。虽然我可以检查该异常(ThreadAbortException),但这是最好的方法吗?

编辑:我正在尝试重定向到某个 url,如果它不存在 - 到另一个 url。

4

3 回答 3

4

由于重定向是客户端操作(服务器只是发送带有代码 302 的响应并将标头location设置为重定向目标),因此您不能指望服务器端Request.Redirect调用会在客户端上成功重定向(或者即使它会被遵循)给您任何指示。

您的选择:

  • 就这样生活
  • 如果重定向是本地的,您至少可以验证本地路径是否存在(或者如果 ysing MVC - 如果定义了具有给定参数的路由)。
  • 如果重定向是远程的,您可以尝试先在服务器上发出请求,看看响应是否合理(如“不是 404”)。

不幸的是,所有用于查看目标页面是否存在的服务器端选项都有严重的缺点:

  • 检查 Url 操作可能很慢
  • 您将不会将身份验证信息/厨师传递到远程位置的页面
  • 一些服务器以 200 响应“页面确实不存在,请看其他地方”。
于 2012-12-09T20:23:55.450 回答
2

我不认为这段代码会获奖,但这至少可以防止 ThreadAbortException ......

知识库文章启发

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 回答