c# - HttpWebrequest 中 HTTP header 的严格排序

标签 c# http-headers httpclient httpwebrequest

尽管 RFC 声明唯一命名的 header 的顺序无关紧要,但我发送此请求的网站确实对 header 的顺序进行了检查。
这有效:

GET https://www.thewebsite.com HTTP/1.1
Host: www.thewebsite.com
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 etc
这不起作用:
GET https://www.thewebsite.com HTTP/1.1
Accept: */*
User-Agent: Mozilla/5.0 etc
Host: www.thewebsite.com
Connection: keep-alive
默认HttpWebRequest好像把HostConnection标题在最后,在空行之前,而不是在 url 之后。
有什么方法(使用 HttpWebRequest 的分支或 Nuget 中的其他库)来指定 HttpWebRequest 中的标题顺序?
如果可能的话,我宁愿不走实现代理的路线来对它们进行排序或不得不使用 TcpClient 对整个事情进行编码。 .
我很感激这方面的任何提示。
更新:随着 Fiddler 的运行,HttpWebrequest 中的 header 顺序可以在 CustomRules.cs 中重新排列。尽管如此,仍然没有更接近没有代理的解决方案。

最佳答案

一些服务器实现 header 排序作为任何攻击或垃圾邮件的预防措施,一篇解释 Why ordering HTTP headers is important 的文章.
但标准是,the order in which header fields with differing field names are received is not significant.HttpWebRequest ,没有简单的方法来订购标题和 ConnectionHost是内部添加的。
如果订购真的很重要,请使用 HttpClient相反,它可以轻松安排 Headers基于@Jason 的例子。
如果您将使用 HttpClient ,您可以创建自定义 HttpClientHandler你可以从那里安排你的标题。它可以是这样的。
处理程序

public class CustomHttpClientHandler : HttpClientHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Clear();

        request.Headers.Add("Host", $"{request.RequestUri.Authority}");
        request.Headers.Add("Connection", "keep-alive");
        request.Headers.Add("Accept", "*/*");
        request.Headers.Add("User-Agent", "Mozilla/5.0 etc");

        return await base.SendAsync(request, cancellationToken);
    }
}
执行
HttpClient clientRequest = new HttpClient(new CustomHttpClientHandler());
await clientRequest.GetAsync(url);

关于c# - HttpWebrequest 中 HTTP header 的严格排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63616473/

相关文章:

java - 使用 Curl/HttpClient 重定向 : header "Location" missing

Angular HttpClient : How to get raw HTTP response, 即使出错

c# - 通过 HttpClient 使用外部 REST Web 服务的存储库模式示例?

c# - File.Exists 无法在网络驱动器上工作

c# - C# 中更复杂的扩展泛型

c# - 与 PostgreSQL 连接的良好技术

c# - Type.GenericTypeArguments 属性与 Type.GetGenericArguments() 方法

安卓谷歌日历 "Unable to launch event"

vue.js - 在 vuejs 应用程序中运行时 axios 响应头丢失数据

c# - 应用程序生命周期的单个 HttpClient - 这个 HttpClient 的单个实例如何确保它响应了正确的请求?