使用 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# 中禁用分块传输编码