Kestrel: декодирование заголовка Http по умолчанию - PullRequest
0 голосов
/ 24 апреля 2019

Я создал ASP .Net Core 2.1 WebAPI, который находится за прокси-сервером, который я не контролирую.Этот Прокси добавляет заголовки http, которые, возможно, содержат не ASCII-символы, такие как Umlaute ä, ü или ö, как часть значения заголовка.

Пакет Hosting Bundle, установленный на WebServer, имеет версию 2.2.4

Если яможет запускать WebAPI с хостингом Inprocess, все будет работать нормально, но нам нужна целевая инфраструктура .Net Framework 4.7.2, и поэтому возможен только внешний хостинг.

Если запрос имеет заголовки Http с Umlaute (ä, ö, ü) мы получаем исключение BadRequest (400) от Kestrel.Я проверил это с помощью Postman на локальном хосте при отладке в VisualStudio 20017 и попробовал целую кучу разных кодировок в значении заголовка Http (Base64, UTF-8, Mime, ISO 8859-1), которые не срабатывают с каждым из них.

  Microsoft.AspNetCore.Server.Kestrel[17]
  Connection id "0HLM7UD7429GT" bad request data: "Malformed request: invalid headers."

Это происходит на таком низком уровне пустельги, что я не нашел способа поймать Исключение и обработать его для себя.Я попытался поймать его с помощью промежуточного программного обеспечения ErrorHandling и ActionFilters.

Но если я использую класс System.Net.Http.HttpClient в своих тестах xUnit и добавлю HttpHeader со значениями Umlaut, Kestrel принимает запрос ивсе работает нормально.

  System.Net.Http.HttpClient client = new Client();
  client.DefaultRequestHeaders.Add("myHeader", "ä");
  var httpResponse = await Client.GetAsync("/api/values");
  httpResponse.EnsureSuccessStatusCode();

Так что должен быть какой-то секретный механизм кодирования / декодирования, реализованный в HttpClient и коде Kestrel, но я не нашел никакой документации по этому поводу.Также не помогла отладка в код .net.

  • Есть ли способ настроить Kestrel, как он должен декодировать значения заголовка по умолчанию?
  • Если нет, как мне это сделать?закодировать мое значение заголовка http, что kestrel будет декодировать его автоматически?(как это работает с классом HttpClient)
...