ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HttpClient / HttpRequestMessage在标头中添加空格

2019-12-11 00:08:52  阅读:637  来源: 互联网

标签:net-core httpclient c


由于它必须为HttpClient提供的功能,我刚进入.net核心(示例是设置keep-alive标头的上限).
我正在使用2.1网络核心和C#7.3

我的问题

我的问题特别是关于设置“ Accept”和“ Accept-Language”标头.我要访问的网站按原样解析了这两个标头,这意味着它必须具有相同的确切格式(包括空格).

使用提琴手(和其他一些工具)来获取我的请求.

>我正在捕获“ Accept”标头,如下所示:(格式错误)

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”标头,如下所示:(格式错误)

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实例中设置我的标头,并使用其自己的标头触发HttpRequestMessage,但均无用.
>在网上尝试了许多无效的解决方案,包括this
>通过多个.Headers.TryAddWithoutValidation拆分标题
>也尝试过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);

如前所述,所有其他标头工作正常.仅这两个接受和接受语言被不同地输入.

解决方法:

好像它是用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

标签:net-core,httpclient,c
来源: https://codeday.me/bug/20191210/2104966.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有