Asp.net core mvc 如何在考虑请求和响应范围标头的情况下流式传输视频或文件?

Asp.net core mvc 如何在考虑请求和响应范围标头的情况下流式传输视频或文件?,asp.net-core-mvc,dnx,Asp.net Core Mvc,Dnx,我现在使用的是FileStreamResult,它可以流式传输视频,但无法查找。它总是从头开始 我使用的是ByteRangeStreamContent,但它似乎不再适用于dnxcore50 那么如何进行呢 我是否需要手动解析请求范围标头并编写自定义的FileResult,以设置响应内容范围和其余标头,并将缓冲区范围写入响应正文,或者是否已经实现了某个,但我缺少它?下面是一个简单的VideoStreamResult。我目前正在使用(多部分内容部分未经测试): 公共类视频流结果:FileStream

我现在使用的是
FileStreamResult
,它可以流式传输视频,但无法查找。它总是从头开始

我使用的是
ByteRangeStreamContent
,但它似乎不再适用于
dnxcore50

那么如何进行呢


我是否需要手动解析请求范围标头并编写自定义的
FileResult
,以设置响应
内容范围和其余标头,并将缓冲区范围写入响应正文,或者是否已经实现了某个,但我缺少它?

下面是一个简单的
VideoStreamResult
。我目前正在使用(多部分内容部分未经测试):

公共类视频流结果:FileStreamResult
{
//BufferedStream类型中定义的默认缓冲区大小
私有常量int BufferSize=0x1000;
私有字符串MultipartBoundary=“”;
公共VideoStreamResult(流文件流、字符串内容类型)
:base(文件流、内容类型)
{
}
公共视频流结果(流文件流、MediaTypeHeaderValue内容类型)
:base(文件流、内容类型)
{
}
私有布尔IsMultipartRequest(RangeHeaderValue范围)
{
返回范围!=null&&range.Ranges!=null&&range.Ranges.Count>1;
}
私有布尔值IsRangeRequest(RangeHeaderValue范围)
{
返回范围!=null&&range.Ranges!=null&&range.Ranges.Count>0;
}
受保护的异步任务WriteVideoAsync(HttpResponse响应)
{
var bufferingFeature=response.HttpContext.Features.Get();
bufferingFeature?.DisableResponseBuffering();
var length=FileStream.length;
var range=response.HttpContext.GetRanges(长度);
if(IsMultipartRequest(范围))
{
response.ContentType=$“multipart/byteranges;boundary={MultipartBoundary}”;
}
其他的
{
response.ContentType=ContentType.ToString();
}
添加(“接受范围”、“字节”);
如果(IsRangeRequest(范围))
{
response.StatusCode=(int)HttpStatusCode.PartialContent;
如果(!IsMultipartRequest(范围))
{
Add(“Content Range”,“$”字节{Range.Ranges.First().From}-{Range.Ranges.First().To}/{length}”);
}
foreach(range.Ranges中的var rangeValue)
{
if(IsMultipartRequest(range))//我不知道multipart是否工作
{
wait response.WriteAsync($“--{MultipartBoundary}”);
wait response.WriteAsync(Environment.NewLine);
wait response.WriteAsync($“内容类型:{ContentType}”);
wait response.WriteAsync(Environment.NewLine);
wait response.WriteAsync($“内容范围:字节{Range.Ranges.First().From}-{Range.Ranges.First().To}/{length}”);
wait response.WriteAsync(Environment.NewLine);
}
等待写入状态响应体(范围值、响应);
if(IsMultipartRequest(范围))
{
wait response.WriteAsync(Environment.NewLine);
}
}
if(IsMultipartRequest(范围))
{
wait response.WriteAsync($“--{MultipartBoundary}--”);
wait response.WriteAsync(Environment.NewLine);
}
}
其他的
{
等待FileStream.CopyToAsync(response.Body);
}
}
私有异步任务WriteDataToResponseBody(RangeItemHeaderValue rangeValue,HttpResponse响应)
{
var startIndex=范围值。从0开始;
var endIndex=rangeValue.To±0;
字节[]缓冲区=新字节[BufferSize];
long totalToSend=endIndex-startIndex;
整数计数=0;
长字节剩余=totalToSend+1;
response.ContentLength=剩余字节数;
Seek(startIndex,SeekOrigin.Begin);
while(字节剩余>0)
{
尝试
{

如果(b)FYI,则.NET Core 2.1中将提供对范围请求的内置支持


工作得很好。干得好!您需要为使用filestream的函数(WriteVideoAsync、WriteDataToResponseBody)添加using。这将允许释放filestream。