之前音视频文件都是直接放在wwwroot的子目录下,通过IIS访问都是能够拖动进度条的。但改成API方式返回流以后,发现居然无法拖进度条了。
找了下,应该和HTTP文件的分段传输特性有关:
http协议从1.1开始支持获取文件的部分内容,这样就能实现并行下载和断点续传了。而这是通过在Header里Range和Content-Range这两个参数实现的 —— 客户端发请求时对应的是Range
,服务器端响应时对应的是Content-Range。
那怎么解决呢?好在MS在底层已经做好了封装,我们只需要设置属性值EnableRangeProcessing为true即可:
var fileExtension = Path.GetExtension(fileName);
var contentType = "application/octet-stream";
switch (fileExtension)
{
case ".pdf":
contentType = "application/pdf";
break;
case ".jpeg":
case ".jpg":
contentType = "image/jpep";
break;
case ".png":
contentType = "image/png";
break;
case ".gif":
contentType = "image/gif";
break;
}
FileStreamResult result = new FileStreamResult(fileStream, contentType);
if (Request.Headers.ContainsKey("Range"))
result.EnableRangeProcessing = true;
return result;
参考文章: