汕头企业制作网站,网站开发语言怎么看,网站源码上传到哪个文件夹,如何在电子表格上做网站的连接HttpClient 禁用自动重定向Intro前段时间写了一个小工具来帮助我们简化一个每个月一次的小任务#xff0c;每个月我们公司的 BI Team 会给我们上个月访问量比较高的博客文章的 url#xff0c;然后我们会根据 BI 提供博客的 url 去找到对应的博客 id#xff0c;然后更新到配置… HttpClient 禁用自动重定向Intro前段时间写了一个小工具来帮助我们简化一个每个月一次的小任务每个月我们公司的 BI Team 会给我们上个月访问量比较高的博客文章的 url然后我们会根据 BI 提供博客的 url 去找到对应的博客 id然后更新到配置中网站会读取这个配置来显示比较受欢迎的博客文章Redirection我们的博客文章有一个特点如果访问的地址只有博客文章的路径会自动跳转到带 id 的地址比如你访问https://cn.iherb.com/blog/8-natural-remedies-for-heartburn-and-acid-reflux 会自动跳转到 https://cn.iherb.com/blog/8-natural-remedies-for-heartburn-and-acid-reflux/347 后面新增的 347 就是对应的博客文章的 idBI team 的同事给到我们的就是示例中的 8-natural-remedies-for-heartburn-and-acid-reflux就是服务器端做了一个重定向通过 浏览器的 Network 我们可以看到发生了一个 302 重定向HttpClient AutoRedirect根据上面的重定向我们使用代码是不是也可以做呢这样我们就可以做到比较自动化了来尝试一下var articlePath /8-natural-remedies-for-heartburn-and-acid-reflux/;
var httpClient new HttpClient()
{BaseAddress new Uri(https://cn.iherb.com/blog/)
};
using var res await httpClient.GetAsync(articlePath[0].TrimStart(/));
Console.WriteLine(res.RequestMessage.RequestUri.ToString());
Console.WriteLine(res.StatusCode);
猜一猜上面的代码输出结果是什么输出结果如下和你预想的结果一样吗可以看到输出的请求地址实际上并不是我们请求的地址这是因为默认地HttpClient 会自动跟随重定向如果服务器重定向了一个请求HttpClient 会读取 response header 中的 Location 来请求下一个地址请求地址和 response 显示的是最终一次请求的信息。你也可以选择禁用自动重定向下面就是一个禁用重定向的示例using var httpClient new HttpClient(new HttpClientHandler()
{AllowAutoRedirect false
})
{BaseAddress new Uri(BaseUrl)
};
using var res1 await httpClient.GetAsync(articlePath[0].TrimStart(/));
Console.WriteLine(res1.RequestMessage.RequestUri.ToString());
Console.WriteLine(res1.StatusCode);
我们可以通过指定 HttpClientHandler 的 AllowAutoRedirect 属性来禁用自动重定向禁用后的输出结果如下可以看到这个请求的请求地址是我们实际请求的地址没有发生重定向那么针对哪些请求会做重定向处理呢通过查阅源码发现对于这些响应会尝试重定向 300/301/302/307/308, 可以参考https://github.com/dotnet/runtime/blob/74246130d505c9243396f4a8837634e8ab3065bb/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs#L87Practice我们已经知道 HttpClient 会自动重定向而且我们只需要拿到重定向后的地址即可那我们就可以禁用自动重定向直接读取 Response Header 里的 Location 中的值就可以拿到要重定向的 URL 了于是就有了下面的代码来获取博客文章的 idprivate async Taskint GetArticleId(string path)
{using var response await httpClient.GetAsync(path.TrimStart(/));var statusCode (int)response.StatusCode;if(statusCode ! 302){return -1;}var newLocation response.Headers.Location.ToString();int.TryParse(newLocation[(newLocation.LastIndexOf(/) 1)..], out var articleId);return articleId;
}
通过上面的代码我们就可以相对高效的拿到博客文章的 id再进一步整理一下构造成我们最终配置所需要的格式var articleIds await Task.WhenAll(articlePath.Select(path GetArticleId(path)));
var json new
{articlelist articleIds.Select(x new{ idx })
}.ToJson();
这样以后我们再统计只需要拷贝一下新的数据跑一下脚本就可以了~~More因为我们只关注 Response Header 所以我们也可以把上面的 GET 请求换成 HEAD 请求这样返回的响应就只有 Header没有 Body 更加简洁一些从业务的角度来看我们可以尝试让别的 Team 同事直接提供一个 API 来返回这样的数据这样我们就不必这样搞了 ^^Referenceshttps://github.com/WeihanLi/SamplesInPractice/blob/master/HttpClientTest/NoAutoRedirectSample.cshttps://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/Net/Http/HttpHandlerDefaults.cshttps://github.com/dotnet/runtime/blob/74246130d505c9243396f4a8837634e8ab3065bb/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs#L87https://stackoverflow.com/questions/14731980/using-httpclient-how-would-i-prevent-automatic-redirects-and-get-original-statuhttps://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htmlhttps://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.allowautoredirect?WT.mc_idDT-MVP-5004222viewnet-5.0https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.maxautomaticredirections?viewnet-5.0WT.mc_idDT-MVP-5004222