Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 移动网络上的.Net Core 206部分内容错误_Asp.net Core_.net Core_Http Headers_Html5 Video_Filestream - Fatal编程技术网

Asp.net core 移动网络上的.Net Core 206部分内容错误

Asp.net core 移动网络上的.Net Core 206部分内容错误,asp.net-core,.net-core,http-headers,html5-video,filestream,Asp.net Core,.net Core,Http Headers,Html5 Video,Filestream,我有一个从客户端后端流式传输视频的客户端和一个api 在客户端后端,视频流有时会在移动网络上出现故障,而api则不会出现这种情况 (.net核心2.0版) 以下是我在客户端后端的文件流(现在已替换为v2.1): 此外,我还启用了我的程序.cs中的范围处理 AppContext.SetSwitch(“Switch.Microsoft.AspNetCore.Mvc.EnableRangeProcessing”,true) 更新到(.net core v2.1)后,仍然存在相同的问题: [HttpGe

我有一个从客户端后端流式传输视频的客户端和一个api

在客户端后端,视频流有时会在移动网络上出现故障,而api则不会出现这种情况

(.net核心2.0版) 以下是我在客户端后端的文件流(现在已替换为v2.1):

此外,我还启用了我的
程序.cs中的范围处理
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);
}
这两种方法都可以正常工作,此方法返回success 206,然后根据视频的大小进行以下几个调用(1-3)

当我的手机使用移动网络时,这两个功能都不起作用,通过wifi也可以

以下是请求标头(为清楚起见,省略了其他标头):

以下是响应标题:

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
以下是控制台中的错误外观:

GEThttp://example.com/ConvertedVideo/video.mp4 206(部分内容)

在“网络”选项卡中:

net::错误内容长度不匹配

我不明白为什么它在移动网络上不起作用?它是否因为部分内容而中断

编辑:在客户端上传输视频之前,使用
ffmpeg
包装器:
MediaToolKit
将视频转换为较低质量。我怀疑这可能是问题的一部分,但为什么它能在wifi上工作而不能在移动网络上工作呢?在相同的视频被发送到api并从api流式传输后,可以通过wifi和移动设备正常工作

api和客户端都托管在IIS共享托管平台上

PS:这是一个动态创建的
html5视频
容器,
src
也是动态生成的,并且加载了vuejs,我怀疑这可能是原因,但我不明白为什么它可以在wifi上工作,而不能在移动网络上工作

编辑:

将客户端项目更新为2.1,仍然是相同的问题

这个问题不会发生在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(类型、名称)
并不能解决问题):

我尝试过的其他事情

  • 我在某个地方读到这可能是防火墙问题,我联系了我的主机提供商,他们确认不是
  • 在流式方法、彻底过滤器、自定义中间件中手动设置标头
    接受范围:“字节”
编辑:Firefox移动浏览器上的测试问题:

第一个请求/响应与失败的请求/响应相同。(工作的流不以接受范围开始:“无”)

但是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
格式。)

无法解码媒体资源。

未能加载所有候选资源。媒体加载已暂停。

无法解码媒体资源,错误:错误代码:(0x806e0006)详细信息:静态MP4Metadata::ResultAndByteBuffer mozilla::MP4Metadata::Metadata(mozilla::ByTestStream*):无法分析元数据


因此,现在我有一个编码错误或部分内容错误。

您应该使用Wireshark捕获TCP会话并检查数据。ERR_CONTENT_LENGTH_MISMATCH提示发送的实际有效负载与标头不匹配,可能连接正在终止。@rudolfsfbundulis我将查看它
private FileStream VideoStream(string type, string name)
{
    var fileStream = new FileStream($"{type}/{name}",
              FileMode.Open,
              FileAccess.Read);

    return fileStream;
}
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