c# - HttpClient/HttpRequestMessage 向 header 添加空格

标签 c# .net-core httpclient

我刚刚接触 .net 核心是因为它必须为 HttpClient 提供的功能(例如设置 keep-alive header capped down)。 我使用的是 2.1 net core 和 C# 7.3

我的问题

我的问题特别是关于设置“Accept”和“Accept-Language” header 。我尝试访问的站点按原样解析这两个 header ,这意味着它必须具有完全相同的格式(包括空格)。

使用 fiddler(和其他一些工具)获取我的请求。

  1. 我捕获的“接受” 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
  1. “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 请求。

我尝试过的

  1. 尝试在 HttpClient 实例中设置我的 header 并用它自己的 header 触发 HttpRequestMessage,但均无效。
  2. 尝试了很多在线解决方案,但均无效,包括 this
  3. 通过多个 .Headers.TryAddWithoutValidation 拆分 header
  4. 也尝试了 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);
            }
        }

https://github.com/dotnet/corefx/blob/a10890f4ffe0fadf090c922578ba0e606ebdd16c/src/System.Net.Http/src/System/Net/Http/Headers/NameValueHeaderValue.cs#L183

我不知道如何覆盖它,但也许你可以在 GitHub 上创建一个新问题?

编辑:发现了一个与此相关的问题并将其提交:https://github.com/dotnet/corefx/issues/18449

关于c# - HttpClient/HttpRequestMessage 向 header 添加空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55833095/

相关文章:

c# - Windows Phone 闹钟不断自行重新开启

c# - 了解 WPF Dispatcher.BeginInvoke

azure - 奥尔良多区域部署

javascript - 使用 callFake() 测试 HttpClient 调用

angular - 如何嵌套包裹在 APP_INITIALIZER 中的 httpclient 调用

c# - 如何在 DropDownList 中保留空格 - ASP.net MVC Razor View

c# - Blazor 父组件可以知道它里面有多少个子组件吗?

c# - 如何在.NET Core中反序列化NetDataContractSerializer数据?

dependency-injection - 使用默认 ASP.NET Core DI 容器在 Service Fabric 上设置依赖注入(inject)

typescript - 使用 Observable 和 HttpClient 的 Angular 5 GET 数据 - 从 Web API 获取数据