我刚刚接触 .net 核心是因为它必须为 HttpClient 提供的功能(例如设置 keep-alive header capped down)。 我使用的是 2.1 net core 和 C# 7.3
我的问题
我的问题特别是关于设置“Accept”和“Accept-Language” header 。我尝试访问的站点按原样解析这两个 header ,这意味着它必须具有完全相同的格式(包括空格)。
使用 fiddler(和其他一些工具)获取我的请求。
- 我捕获的“接受” header 如下:(格式不正确)
text/html, application/xhtml+xml, application/xml; q=0.9, image/webp, image/apng, */*; q=0.8, application/signed-exchange; v=b3
而不是:(正确的格式)
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
- “Accept-Language” header 如下:(格式不正确)
en-US, en; q=0.9, ar; q=0.8, und; q=0.7
代替:(正确格式)
en-US,en;q=0.9,ar;q=0.8,und;q=0.7
我在 HttpRequestMessage 的帮助下使用 HttpClient 模拟 GET 请求。
我尝试过的
- 尝试在 HttpClient 实例中设置我的 header 并用它自己的 header 触发 HttpRequestMessage,但均无效。
- 尝试了很多在线解决方案,但均无效,包括 this
- 通过多个
.Headers.TryAddWithoutValidation
拆分 header - 也尝试了 HttpWebRequests。没有运气。 需要注意的一件事是,由于我的项目,我也喜欢坚持使用 HttpClient。
您会在我当前的代码下方找到
var client = new HttpClient(new HttpClientHandler() { UseCookies = false,
AllowAutoRedirect = false,
Proxy = new WebProxy("localhost:8888") });
var httpReq = new HttpRequestMessage(HttpMethod.Get, $"myurl");
httpReq.Headers.TryAddWithoutValidation("Host", "myurl");
httpReq.Headers.TryAddWithoutValidation("Connection", "keep-alive");
httpReq.Headers.TryAddWithoutValidation("Cookie", $"cookie");
httpReq.Headers.TryAddWithoutValidation("Upgrade-Insecure-Requests", "1");
httpReq.Headers.TryAddWithoutValidation("User-Agent", Data.user_agent);
httpReq.Headers.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, br");
httpReq.Headers.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
httpReq.Headers.TryAddWithoutValidation("Referer", Data.homeUrl);
httpReq.Headers.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.9,ar;q=0.8,und;q=0.7");
req = await client.SendAsync(httpReq);
如前所述,所有其他标题都工作正常。只是Accept和Accept-Language这两个输入方式不一样。
最佳答案
它似乎是在 corefx 中硬编码的,看这里:
destination.Append(' ');
完整方法:
internal static void ToString(ObjectCollection<NameValueHeaderValue> values, char separator, bool leadingSeparator,
StringBuilder destination)
{
Debug.Assert(destination != null);
if ((values == null) || (values.Count == 0))
{
return;
}
foreach (var value in values)
{
if (leadingSeparator || (destination.Length > 0))
{
destination.Append(separator);
destination.Append(' ');
}
value.AddToStringBuilder(destination);
}
}
我不知道如何覆盖它,但也许你可以在 GitHub 上创建一个新问题?
编辑:发现了一个与此相关的问题并将其提交:https://github.com/dotnet/corefx/issues/18449
关于c# - HttpClient/HttpRequestMessage 向 header 添加空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55833095/