gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:10:40 25 4
gpt4 key购买 nike

尽管 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com