我正在尝试将一个视频(通过ASP.NET MVC 5 Action保存为Ravendb-Database中的附件)流式传输到WebBrowser。它使用以下代码,但视频在视频启动之前完全下载。我不知道我做错了什么。
我找到了一些在MVC中进行Streaming的方法,但是他们似乎期待一个Seekable Stream - 但是我从Ravendb收到的流是不可寻找的;它甚至不提供长度。因此,唯一的方法是将ravendb-stream复制到内存流并从那里提供PartialContent或类似内容。
有人有更好的解决方案吗?我不能成为唯一一个想要从数据库中流式传输视频而不将完整的视频加载到内存中的人。
我正在从ravendb获取附件,如下所示:
public async Task<System.IO.Stream> GetAttachmentAsync(IAttachmentPossible attachedObject, string key)
{
using (var ds = InitDatabase())
{
using (var session = ds.OpenAsyncSession())
{
try
{
var result = await session.Advanced.Attachments.GetAsync(attachedObject.Id, key);
return result.Stream;
}
catch (Exception ex)
{
return null;
}
}
}
}
之后我将流发送到浏览器,如下所示:
var file = await _database.GetAttachmentAsync(entry, attachmentId);
HttpResponseMessage msg = new HttpResponseMessage(HttpStatusCode.OK);
msg.Content = new StreamContent(file);
msg.Content.Headers.ContentType = new MediaTypeHeaderValue("video/mp4");
return msg;
有任何想法吗?非常感谢你!
我认为将流复制到内存流中是正确的。你联系的答案(https://stackoverflow.com/a/39247028/10291808)你可以做流式传输。
也许可以考虑从db中检索文件所做的多次调用(也许你可以在有限的时间内缓存文件以提高性能)。