使用 HttpClient C# .NET 获取 URL

Posted

技术标签:

【中文标题】使用 HttpClient C# .NET 获取 URL【英文标题】:Get URL using HttpClient C# .NET 【发布时间】: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? 【参考方案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 响应以进行重定向。必须相应地修改您对有效代码的检查。

【讨论】:

以上是关于使用 HttpClient C# .NET 获取 URL的主要内容,如果未能解决你的问题,请参考以下文章

C# HttpClient使用和注意事项,.NET Framework连接池并发限制

.NET 4.5 和 C# 中带有 HttpClient 的 HTTP HEAD 请求

无法使用 C# HttpClient 获取任何 cookie

如何使用 HttpClient 在 ASP.Net C# 中禁用分块传输编码

c#:如何使用 httpclient 发布异步请求并获取流?

C#使用HttpClient获取Location