model-view-controller - 出现错误:HttpRequestException:收到无效的标头名称:'Content=Transfer-Encoding'。使用 MVC Core 下载文件时
问题描述
我正在尝试让 MVC 核心(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())
使用提琴手,请求看起来不错,它抱怨的标头是:Content=Transfer-Encoding: binary,它在 content-disposition 中有文件作为附件。不幸的是,我完全无法控制发送服务器,但这在浏览器中运行良好。谁能告诉我我做错了什么?
谢谢
解决方案
传入的请求看起来格式不正确。Transfer-Encoding 是它自己的标头名称。您不能将其分配给另一个标头的值。而且 AFAIK,内容甚至不是标准的 HTTP 标头名称。
有关有效的 Content-* 标头,请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#Message_body_information中的列表。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);
}
编辑 dotnet 核心
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}");
}
推荐阅读
- javascript - JavaScript - 选择具有 data-id 的 li 元素,它等于特定值
- javascript - 如何使用量角器查找元素是否可见
- c# - 如何在 C# 中编写多行 SQL 字符串但将其视为单行字符串
- node.js - 如何在 AWS 中计算基于 SaaS 的应用程序中的租户成本
- flutter - 无法使用颤振中的wifi包连接到wifi
- android - 对于带有 XF 的 Android,Play 商店图标的大小应该是多少?
- angular - ng build --watch:幕后发生了什么?
- c# - 如何在运行时将属性动态添加到对象c#?
- flutter - Flutter web api调用XMLHttpRequest错误
- angular - 深度链接时 Angular 9 + Ngnix = 404