Получение ошибки: HttpRequestException: получено неверное имя заголовка: 'Content = Transfer-Encoding'. при использовании MVC Core для загрузки файла - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь установить контроллер в MVC core (3.1), загрузить аудиофайл для представления пользователю, но все, что я пытаюсь, заканчивается ошибкой:

HttpRequestException: Received an invalid header name: 'Content=Transfer-Encoding'.

Я пытался webclient, httpclient и только в последнее время webrequest / webresponse. Мой код выглядит следующим образом (подробности удалены для безопасности):

WebRequest downloadRequest = WebRequest.Create({url here});
            downloadRequest.Headers.Add("Cookie", "{cookie data here};");
            downloadRequest.Headers.Add("Accept", "application/json, text/javascript, */*; q=0.01");
            downloadRequest.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0");
            downloadRequest.Headers.Add("Sec-Fetch-Dest", "empty");
            downloadRequest.Headers.Add("X-Requested-With", "XMLHttpRequest");

            using (WebResponse webResponse = await downloadRequest.GetResponseAsync())
            {

                 return File(webResponse.GetResponseStream(), "audio/wav", wavFile + ".txt");
            }

Ошибка в строке

 using (WebResponse webResponse = await downloadRequest.GetResponseAsync())

При использовании fiddler запрос выглядит хорошо, а в заголовке он жалуется about is: Content = Transfer-Encoding: двоичный файл, содержащий файл в расположении содержимого в качестве вложения. К сожалению, я не контролирую отправляющий сервер, но в браузере это работает нормально. Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

Спасибо

1 Ответ

0 голосов
/ 20 марта 2020

Входящий запрос выглядит неверно. Transfer-Encoding - это собственное имя заголовка. Вы не можете присвоить его значению другого заголовка. И AFAIK, Контент даже не является стандартным именем заголовка HTTP.

См. Список в https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#Message_body_information для правильных заголовков Content- *. Заголовок Transfer-Encoding документирован в https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding.

Редактировать для платформы 4.8 и ниже

Мне пришлось добавить следующие строки в app.config, чтобы позволить клиенту обрабатывать недействительные ответы от сервера.

<system.net>
  <settings>
    <httpWebRequest useUnsafeHeaderParsing="true" />
  </settings>
</system.net>

Сама программа показана ниже.

try
{
    var httpclient = new HttpClient();
    var response = await httpclient.GetAsync("http://localhost:9091");

    var attachment = new byte[1024];
    foreach (var h in response.Content.Headers)
    {
        var e = h.Value.GetEnumerator();
        e.MoveNext();
        attachment = Encoding.UTF8.GetBytes(e.Current); // Convert UTF-8 encoded string into raw bytes

        Console.WriteLine($"{h.Key}, {Encoding.UTF8.GetString(attachment)}"); // Save raw bytes to disk instead of converting back to string and writing to Console
    }
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}

Редактировать для do tnet core

try
{
    var s = new Socket(SocketType.Stream, ProtocolType.Tcp);
    var a = IPAddress.Parse("127.0.0.1");
    await s.ConnectAsync(a, 9091);

    var request = "GET http://localhost:9091/";
    var outBytes = Encoding.UTF8.GetBytes(request);
    var outBuffer = new ArraySegment<byte>(outBytes);

    await s.SendAsync(outBuffer, SocketFlags.None);

    var inBytes = new byte[1024];
    var inBuffer = new ArraySegment<byte>(inBytes);
    await s.ReceiveAsync(inBuffer, SocketFlags.None);

    var r = Encoding.UTF8.GetString(inBuffer.Array);
}
catch (SocketException exception)
{
    Console.WriteLine($"Error: {exception.Message}");
}
...