【问题标题】:What is the correct way to TRY to Response.Redirect?尝试 Response.Redirect 的正确方法是什么?
【发布时间】:2012-12-09 19:29:52
【问题描述】:

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

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

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

【问题讨论】:

  • 如果失败,您不会重定向,并且会显示一条消息。你的意思是如果无法重定向?您不知道目标网址吗?什么?
  • @Aristos 这是我的问题 - 如何 我知道它失败了。 - 我的意思是 - 程序是如何通知的。
  • 如果它如此重要以至于您需要知道,那么您需要在目标 url 上添加信号。如果您只想知道目标 url 是否存在,那么您只需在重定向之前检查它,然后使用来自代码后面的 url 调用。
  • “重定向失败”是什么意思?重定向只是带有代码 302 和 location 标头的特殊响应 - 服务器没有内置方法可以知道客户端是否遵循重定向...(您有关于不抛出 ThreadAbortException 的答案,但它只对数字有帮助抛出异常的次数,如果重定向失败/成功...)

标签: c# asp.net .net html


【解决方案1】:

由于重定向是客户端操作(服务器只需发送响应代码为 302 和标头 location 设置为重定向目标),您不能指望服务器端 Request.Redirect 调用会在客户端(或即使它会被遵循)。

你的选择:

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

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

  • 检查 Url 操作可能很慢
  • 您将无法将身份验证信息/cook 传递到远程位置的页面
  • 一些服务器以 200 响应“页面确实不存在,请看其他地方”。

【讨论】:

  • 谢谢。如果我错了,请纠正我 - 即使在本地环境中检查文件是否存在也可能会遇到权限问题(它在网络托管服务上),因为我确实需要知道 - 我' m 留下了发送请求并查看它是否失败的选项。 (我可以通过检查我的网络主机如何管理来知道)
  • @ispiro,是的。请注意,在检查文件是否存在时,您也可能会遇到反向问题 - 本地代码能够访问比 HTTP 更多的文件。
  • 谢谢。​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
【解决方案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
}

【讨论】:

  • +1。请注意,不抛出异常将使页面上的其他代码完成执行 - 确保您在重定向之后不执行任何操作(即我相信您甚至可以通过在 Respose.Redirect(url, false) 之后调用 Resposnse.Clear() 来删除重定向)。
  • 我刚刚尝试使用“false”重定向到一个不存在的 url,(在本地主机上的 Visual Web Developer 中运行)并且浏览器显示“找不到资源”,即使我有一个空 @ 987654325@ 在try 中重定向后。
  • 您只能检测服务器端错误,如果您重定向到不存在的东西,只有浏览器会知道......从重定向的角度来看,重定向(“/非现有页面”很好/foo.html") 假设客户端仍然连接(因此 HTTP 标头被发送到客户端)
【解决方案3】:

好吧,这将检查 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;
                }
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多