尝试到Response.Redirect的正确方法是什么?

时间:2012-12-09 19:29:52

标签: c# asp.net .net html

我想重定向到网址,但如果失败则会收到通知。

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

编辑:我正在尝试重定向到某个网址,如果它不存在,则转到另一个网址。

3 个答案:

答案 0 :(得分:4)

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

您可以选择:

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

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

  • 检查Url可能会导致运行缓慢
  • 您不会将身份验证信息/炊具传递给远程位置的页面
  • 一些服务器响应200,因为“页面确实不存在,请查看其他地方”。

答案 1 :(得分:2)

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

KB article

的启发
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
}

答案 2 :(得分: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;
                }
            }
        }