【发布时间】:2017-12-14 04:54:37
【问题描述】:
我正在尝试将音频文件流式传输到 Angular 应用程序,其中 html5 音频元素和 src 设置为我的 api 端点(例如 /audio/234)。我的后端是用 .NET Core 2.0 实现的。我已经实现了这种流式传输:.NET Core| MVC pass audio file to html5 player. Enable seeking
如果我没有在音频开始播放时立即搜索到文件结尾,则搜索有效。我使用音频元素的自动播放属性立即开始播放音频元素有足够的数据。因此,在我的情况下,音频元素在我寻找时还没有所有数据,因此它对我的 API 进行了新的 GET。在这种情况下,我的后端日志中有这个异常:
失败:Microsoft.AspNetCore.Server.Kestrel[13] [1] 连接 ID“0HL9V370HAF39”,请求 ID“0HL9V370HAF39:00000001”:应用程序抛出了未处理的异常。 [1] System.InvalidOperationException:响应内容长度不匹配:写入的字节太少(0 of 6126919)。
这是我的音频控制器 GET 方法。
byte[] audioArray = new byte[0];
//Here I load audio file from cloud
long fSize = audioArray.Length;
long startbyte = 0;
long endbyte = fSize - 1;
int statusCode = 200;
var rangeRequest = Request.Headers["Range"].ToString();
_logger.LogWarning(rangeRequest);
if (rangeRequest != "")
{
string[] range = Request.Headers["Range"].ToString().Split(new char[] { '=', '-' });
startbyte = Convert.ToInt64(range[1]);
if (range.Length > 2 && range[2] != "") endbyte = Convert.ToInt64(range[2]);
if (startbyte != 0 || endbyte != fSize - 1 || range.Length > 2 && range[2] == "")
{ statusCode = 206; }
}
_logger.LogWarning(startbyte.ToString());
long desSize = endbyte - startbyte + 1;
_logger.LogWarning(desSize.ToString());
_logger.LogWarning(fSize.ToString());
Response.StatusCode = statusCode;
Response.ContentType = "audio/mp3";
Response.Headers.Add("Content-Accept", Response.ContentType);
Response.Headers.Add("Content-Length", desSize.ToString());
Response.Headers.Add("Content-Range", string.Format("bytes {0}-{1}/{2}", startbyte, endbyte, fSize));
Response.Headers.Add("Accept-Ranges", "bytes");
Response.Headers.Remove("Cache-Control");
var stream = new MemoryStream(audioArray, (int)startbyte, (int)desSize);
return new FileStreamResult(stream, Response.ContentType)
{
FileDownloadName = track.Name
};
我错过了一些标题还是什么?
我在 .NET Core 1.1 中没有遇到此异常,但我不确定这只是巧合和/或错误的测试。但是,如果有人知道 .NET Core 中与流相关的内容是否发生了变化,我将不胜感激。
【问题讨论】:
标签: html angular audio .net-core mp3