【发布时间】:2014-05-12 22:26:31
【问题描述】:
我正在尝试使用 System.Net.Http.HttpClient 执行一些 HEAD 检查。它适用于除 301 重定向之外的所有内容。在这种情况下,HttpClient 说状态 200,即使服务器说 301 并提供了一个新位置。
这里有一个快速测试来验证我所看到的:
[Test]
public async void Test301Capture()
{
const string url = "http://www.youtube.com/"; // http://www.youtube.com/ does a 301 to https://www.youtube.com/
var httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = false };
using (var client = new HttpClient(httpClientHandler))
using (var headRequest = new HttpRequestMessage(HttpMethod.Head, url))
using (var headResponse = await client.SendAsync(headRequest))
{
Log.InfoFormat("Result of HEAD check on \"{0}\" is: {1}", url, headResponse.StatusCode); // *should* be a 301
Assert.AreNotEqual(200, (int)headResponse.StatusCode); // *fails* because StatusCode *is* 200
}
}
上面的输出是:
Result of HEAD check on "http://www.youtube.com/" is: OK
我知道服务器说的是 301,因为使用高级 REST 客户端进行快速 HEAD 检查以测试 http://www.youtube.com/ 说:
Redirect
To:https://www.youtube.com/ with status: 301 Show explanation HTTP/1.1 301 Moved Permanently
Redirection information has not been cached.
Date: Tue, 01 Apr 2014 20:08:09 GMT
Server: gwiseguy/2.0
Content-Length: 0
Cache-Control: no-cache
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Expires: Tue, 27 Apr 1971 19:44:06 EST
X-XSS-Protection: 1; mode=block; report=https://www.google.com/appserve/security-bugs/log/youtube
Location: https://www.youtube.com/
Alternate-Protocol: 80:quic
我确实找到了这个答案,Using HttpClient, how would I prevent automatic redirects and get original status code and forwading Url in the case of 301,但是我的结果不同。
【问题讨论】:
-
Upshot:@kyleb 使用 pinvoke 的经验,以及我自己使用 .NET 套接字的使用测试(以及 Python 的野兔刺伤)让我相信 301 的自动重定向已融入低级别Windows 上的网络。
标签: c# redirect httpclient http-status-code-301