asp.net-core - .Net Core 206 移动网络上的部分内容错误
问题描述
我有一个客户端,它从客户端后端和一个 api 流式传输视频。
在客户端后端,视频流有时会在移动网络上发生故障,而 api 永远不会发生这种情况。
(.net core v2.0)这是我在客户端后端的文件流(现在替换为 v2.1):
[HttpGet("ConvertedVideo/{path}")]
public FileStreamResult ConvertedVideo(string path)
{
return FileStreamResult(_fileManager.ConvertedStream(path), "video/mp4");
}
我还在我的Program.cs
with
中启用了范围处理AppContext.SetSwitch("Switch.Microsoft.AspNetCore.Mvc.EnableRangeProcessing", true);
更新到(.net core v2.1)后仍然是同样的问题:
[HttpGet("ConvertedVideo/{path}")]
public FileStreamResult ConvertedVideo(string path)
{
var stream = _fileManager.ConvertedStream(path);
return File(stream, "video/mp4", path, true);
}
这两种方法都可以正常工作,此方法返回成功 206,然后根据视频的大小进行一些后续调用 (1-3)。
当我的手机使用移动网络时,这两个都不能在我的手机上工作,通过 wifi 就可以了。
这是请求标头(为清楚起见,省略了其他标头):
Accept: */*
Accept-Encoding: identity;q=1, *;q=0
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Range: bytes=0-
这是响应标头:
Accept-Ranges: none
Cache-Control: no-cache
Connection: close
Content-Length: 1247369
Content-Range: bytes 0-1247368/1247369
Content-Type: video/mp4
Date: Sun, 22 Jul 2018 16:27:13 GMT
Pragma: no-cache
Server: Kestrel
X-Powered-By: ASP.NET
以下是控制台中错误的样子:
GET http://example.com/ConvertedVideo/video.mp4 206 (Partial Content)
在网络选项卡中:
net::ERR_CONTENT_LENGTH_MISMATCH
我不明白为什么它不能在移动网络上运行?是因为它是部分内容而破坏吗?
编辑:在客户端上流式传输视频之前,使用ffmpeg
wrapper:将其转换为较低质量MediaToolKit
。我怀疑这可能是问题的一部分,但为什么它可以在 wifi 而不是移动网络上工作?在将相同的视频发送到 api 并从那里流式传输之后,在 wifi 和移动设备上都可以正常工作。
api 和客户端都托管在 IIS 共享托管平台上。
PS:它是一个动态创建的html5-video
容器,src
也是动态生成的,并且加载了 vuejs,我怀疑这可能是原因,但我不明白为什么它可以在 wifi 上工作,而不是在移动网络上工作。
编辑:
将客户端项目更新到 2.1,仍然是同样的问题。
在 iPhone 上不会出现此问题。 确实如此。它在 Iphone 上的效果比在 iPhone 上的效果要好。
在客户端上运行的 Api 视频流:
[HttpGet("matchvid/{id}/{path}")]
public FileStreamResult Get(string id, string path)
{
return new FileStreamResult(_fileManager.VideoStream(id, path), "video/mp4");
}
这就是我读取文件的方式(更改为Path.Combine(type, name)
不能解决问题。):
private FileStream VideoStream(string type, string name)
{
var fileStream = new FileStream($"{type}/{name}",
FileMode.Open,
FileAccess.Read);
return fileStream;
}
我尝试过的其他事情
- 我在某处读到这可能是防火墙问题,我联系了我的托管服务提供商,他们确认不是。
Accept-Ranges: "bytes"
在流方法中手动设置标头,彻底的过滤器,自定义中间件。
编辑:Firefox 移动浏览器上的测试问题:
第一个请求/响应与失败的请求/响应相同。(工作的流不以 Accept-Ranges: "none" 开头)
但随后 FF 发出第二个请求/响应(这在 chrome 中不会发生)。
要求:
Accept: video/webm,video/ogg,video/*;q…q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language: en-GB,en;q=0.5
Connection: keep-alive
Range: bytes=8904-
回复:
Accept-Ranges: bytes
Connection: keep-alive
Content-Disposition: attachment; filename=received_…received_1416546955092120.mp4
Content-Length: 1330243
Content-Range: bytes 8904-1339146/1339147
Content-Type: video/mp4
这是随后的错误(src
期望video/mp4
,文件流返回video/mp4
并且文件是mp4
格式。)
Media resource <url> could not be decoded.
All candidate resources failed to load. Media load paused.
Media resource <url> could not be decoded, error: Error Code:(0x806e0006) Details: static MP4Metadata::ResultAndByteBuffer mozilla::MP4Metadata::Metadata(mozilla::ByteStream *): Cannot parse metadata
所以现在我有一个编码错误或部分内容错误。
解决方案
推荐阅读
- python - Python:如何在另一个函数中包含一个函数?
- java - 如何使用 Zxing 更好地读取数据矩阵?
- reactjs - 未处理的拒绝(错误):帖子不能为空
- google-bigquery - Union All 的列数不匹配
- python - How to perform on global dataframe in the target function of multiprocessing in python?
- azure - 从公共天蓝色函数调用私有函数?
- php - 具有 3 个表的复杂选择
- c# - .net core 和 powershell 之间的文件枚举性能
- c - 如何在 gtk3 c 中自动刷新窗口
- flutter - 照片变暗包相机