尽管 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
好像把Host
和 Connection
标题在最后,在空行之前,而不是在 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
,没有简单的方法来订购标题和 Connection
和 Host
是内部添加的。
如果订购真的很重要,请使用 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/