【问题标题】:Get URL using HttpClient C# .NET使用 HttpClient C# .NET 获取 URL
【发布时间】:2016-01-26 23:43:26
【问题描述】:

我正在尝试使用 HttpClient 获取页面的 URL。我以前只使用过 HttpWebRequest,但我需要将其设为异步方法。 在下面的代码中,myUri 总是返回 null,这导致我稍后尝试处理它时抛出异常。

位置标头是否使用错误?

        string myUrl = "http://www.example.com/"; 
        Uri myUri= new Uri(myUrl);
        using (HttpClient client = new HttpClient())
        using (HttpResponseMessage response = await client.GetAsync(myUri))
        {
            if (response.IsSuccessStatusCode)
            {
                myUri= response.Headers.Location;
                Debug.WriteLine("True "+ myUri);
            } 
            else {
                Debug.WriteLine("False " + myUri);
            }
        }

【问题讨论】:

  • response.Headers.Location 指的是重定向。它不会总是被设置
  • @Rob 好的,谢谢,我正在尝试获取重定向的 URL,但它似乎总是返回 null。
  • 您是否尝试获取页面重定向到的最终 URL?

标签: c# .net asynchronous header httpclient


【解决方案1】:

这是因为HttpClient 会自动跟随重定向。如果您需要页面重定向到的 URL,您需要阻止它自动跟随:

将您的代码更改为以下内容:

string myUrl = "http://www.example.com/"; 
Uri myUri= new Uri(myUrl);

HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.AllowAutoRedirect = false;

using (HttpClient client = new HttpClient(httpClientHandler))

【讨论】:

    【解决方案2】:

    这是解析最终重定向 URL 的异步方法:

    public static async Task<string> ResolveFinalRedirectAsync(string url) 
    { 
      try
      { 
        var req = WebRequest.CreateHttp(url); 
        req.AllowAutoRedirect = true;
        var res = await req.GetResponseAsync(); 
        return res.ResponseUri.AbsoluteUri; 
      } 
      catch
      { 
        Console.WriteLine("Couldn't resolve '{0}'", url); 
      } 
      return null; 
    } 
    

    【讨论】:

      【解决方案3】:

      查看@Rob 关于 AllowAutoRedirect 的回答。

      一旦你这样做了,请注意

      线

      if (response.IsSuccessStatusCode)
      

      如果您收到 HTTP 301 重定向(200-299 范围之外的任何内容),则评估为 false

      指示 HTTP 响应是否成功的值。如果 HttpStatusCode 在成功范围内 (200-299),则为 true;否则为假。

      (source)

      好的,谢谢,我正在尝试获取重定向的 URL

      如果您阻止自动跟踪重定向,您将收到 3xx 范围内的 HTTP 响应以进行重定向。必须相应地修改您对有效代码的检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 2017-05-11
        • 2019-12-25
        • 2015-12-31
        • 1970-01-01
        相关资源
        最近更新 更多