【问题标题】:C# detect page redirectC# 检测页面重定向
【发布时间】:2011-02-02 02:12:52
【问题描述】:

我正在尝试确定http://www.accreditedqualifications.org.uk 上是否存在资格 形式:

http://www.accreditedqualifications.org.uk/qualification/50084811.seo.aspx

50084811 是最终用户输入的资格目标。

如果他们输入无效的,例如

http://www.accreditedqualifications.org.uk/qualification/50084911.seo.aspx

它们被重定向到错误页面(据我所知,http 标头不正确)。有没有办法在 C# 中检测重定向。我希望能够检测到 http 标头中的重定向(认为它会发出 2)或类似的,而不是必须下载整个页面。这可能会发生很多,所以我想尽量减少流量。

编辑

用这个来看看标题,好像有两个是针对无效页面发出的:

http://pageheaders.com/display-http-headers.php?url=http%3A%2F%2Fwww.accreditedqualifications.org.uk%2Fqualification%2F50084911.seo.aspx&agent=ie6

【问题讨论】:

    标签: c# .net webclient


    【解决方案1】:

    有许多不同的代码可以返回。您可以检查各种代码:

    response.StatusCode == HttpStatusCode.Redirect
    

    您可以在http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx查看所有可能性

    或者,您可能会发现检查响应中的位置是否不同就足够了。

    var request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "HEAD";
    request.AllowAutoRedirect = false;
    
    string location;
    using (var response = request.GetResponse() as HttpWebResponse)
    {
      location = response.GetResponseHeader("Location");
    }
    return (location != uri.OriginalString);
    

    【讨论】:

      【解决方案2】:

      最简单的方法可能是在将AllowAutoRedirect 设置为false 的HttpWebRequest 中使用HEAD 请求(将Method 设置为“HEAD”)获取内容。我不记得这是否会导致异常,但无论哪种方式都应该很容易处理。

      【讨论】:

      • 发现这个stackoverflow.com/questions/924679/… 我认为它是正确的,但是由于该站点没有发出 404 或类似的问题,所以它不起作用。我会继续尝试。
      • @petebob796:使用WebClient 可能无法为您提供足够的控制权。特别是,它不允许您关闭自动重定向(据我所知)。使用 HttpWebRequest 并查看响应代码。 301和302是正常的重定向响应码。
      • 感谢现在使用 HttpWebRequest 和 HttpWebResponse 以及 request.AllowAutoRedirect = false;和 request.Method = "HEAD";。对于其他阅读的人,我被 StatusCode 抓住了一秒钟,它返回“OK”、“NOT FOUND”……但它是一个枚举,可以转换为实际的错误 301、302……
      【解决方案3】:

      您只能使用服务器上的网络客户端来执行此操作。如果您将链接提供给您的客户,您将无法参与他与认证资格网络服务器之间的通信,因此您将无法获得链接已重定向到错误的信息。

      据我了解您的项目,我会从我的服务器使用 Webclient(或其他任何方式)进行一些调用,以确保存在资格并将结果存储在数据库中并有缓冲时间。它将允许不要打太多电话并获得可靠的信息。

      【讨论】:

      • 这实际上是一个 winforms 项目而不是 asp.net 我只需要验证他们输入的目标是否有效,因为它在网站上。
      【解决方案4】:

      试试这个:

      try
      {
           HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(line);
           myHttpWebRequest.Timeout = 20000;
           myHttpWebRequest.MaximumAutomaticRedirections = 1;
           myHttpWebRequest.AllowAutoRedirect = true;
           HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
           if (myHttpWebResponse.ResponseUri.ToString() == "Some website")
               {
                    //your logic
               }
      
           myHttpWebResponse.Close();
      }
      catch (WebException)
      {
           // record exception
      }
      

      它基于将 AllowAutoRedirect 设置为 false 的 httpwebrequest 的 HEAD 请求。

      【讨论】:

        【解决方案5】:

        有两种方法可以检测页面重定向:

        1. 检查您的 HttpWebResponse 中是否设置了 response.StatusCode == HttpStatusCode.Redirect
        2. 比较request.RequestUriresponse.ResponseUri

        请注意 1) 取决于服务器的实现,并非所有服务器都设置此状态码,因此选项 2) 可能更可靠:

        HttpWebRequest request = CreateWebRequest(requestString);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        bool redirected = request.RequestUri.ToString() != response.ResponseUri.ToString();
        

        【讨论】:

          猜你喜欢
          • 2011-10-19
          • 2011-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-24
          • 2021-12-25
          • 2018-12-29
          相关资源
          最近更新 更多