我正在开发一个项目(服务器端),我需要将数据(视频,大文件)传输到客户端。
这使用ByteRangeStreamContent
完美无缺,因为我从磁盘提供文件并可以创建可搜索的流(FileStream
)。
if (Request.Headers.Range != null)
{
try
{
HttpResponseMessage partialResponse = Request.CreateResponse(HttpStatusCode.PartialContent);
partialResponse.Content = new ByteRangeStreamContent(fs, Request.Headers.Range, mediaType);
return partialResponse;
}
catch (InvalidByteRangeException invalidByteRangeException)
{
return Request.CreateErrorResponse(invalidByteRangeException);
}
}
else
{
response.Content = new StreamContent(fs);
response.Content.Headers.ContentType = mediaType;
return response;
}
但是,我将文件提供程序从磁盘移动到外部服务。该服务允许我获取数据块(范围{0} - {1})。
当然,不可能在内存中下载整个文件然后使用MemoryStream
作为ByteRangeStreamContent
,因为显而易见的原因(太多的并发下载会在某些时候消耗所有可用内存)
我发现这篇文章https://vikingerik.wordpress.com/2014/09/28/progressive-download-support-in-asp-net-web-api/,作者说:
我为我的图书馆提供的更改请求仅支持阅读 必要的数据并发送出来而不是打开流 完整的数据。在用户之前我不确定这会买什么 他们指出他们正在从WCF流中读取他们的资源数据 这不支持寻求,需要阅读整个流 进入MemoryStream以便允许库生成 输出
这个限制仍然存在于这个特定的对象中,但有一个 解决方法。您可以使用而不是使用ByteRangeStreamContent 而是使用ByteArrayContent对象。自大多数 RANGE请求将用于单个开始和结束字节,您可以拉 来自HttpRequestMessage的范围,只检索你的字节 需要并将其作为字节流发送回去。你还需要添加 CONTENT-RANGE标头并将响应代码设置为206 (PartialContent)但这可能是一个可行的选择(尽管我 对于不想要或不能轻易获得的用户,没有测试过 兼容的流对象。
所以,我的问题基本上是:我怎么能这样做?