HttpClient / HttpRequestMessage добавляет пробелы в заголовки - PullRequest
3 голосов
/ 24 апреля 2019

Я только что вошел в ядро ​​.net из-за функций, которые он может предложить для HttpClient (например, установка заголовка keep-alive ограничена). Я использую 2,1 чистое ядро ​​и C # 7.3

Мой выпуск

Моя проблема касается установки заголовков «Accept» и «Accept-Language». Сайт, к которому я пытаюсь добраться, анализирует эти два заголовка как есть, то есть он должен иметь одинаковый точный формат (включая пробелы).

Использование фиддлера (и некоторых других инструментов) для получения моего запроса.

  1. Я фиксирую заголовок «Принять» следующим образом: (неверный формат)
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» в следующем виде: (неверный формат)
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

Я моделирую запрос GET с помощью HttpClient с помощью HttpRequestMessage.

Что я пробовал

  1. Пробовал обе настройки моих заголовков в экземпляре HttpClient и запускает HttpRequestMessage со своими собственными заголовками, ни одна из них не работает.
  2. Перепробовал множество онлайн-решений, которые не работали, включая this
  3. Разделение заголовка на несколько .Headers.TryAddWithoutValidation
  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 вводятся по-разному.

1 Ответ

2 голосов
/ 08 мая 2019

Кажется, что он жестко запрограммирован в 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

...