通过ASP.Net MVC从RavenDB流视频

时间:2018-08-29 19:39:50

标签: c# asp.net-mvc ravendb

我正在尝试通过ASP.NET MVC 5 Action将视频作为附件保存在Ravendb数据库中,并将其流式传输到WebBrowser。它正在使用以下代码,但是在视频启动之前已完全下载了视频。我不明白我在做什么错。

我发现了一些在MVC中进行流式传输的方法,但是它们似乎期望有一个Seekable流-但是我从Ravendb接收到的流是不可搜索的。它甚至不提供长度。因此,唯一的方法是将ravendb流复制到内存流,并从那里提供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;

有什么想法吗?非常感谢你!

1 个答案:

答案 0 :(得分:0)

我认为将流复制到内存流中是正确的。通过链接的答案(https://stackoverflow.com/a/39247028/10291808),您可以进行流式传输。

也许可以考虑考虑从数据库检索文件的多次调用(也许您可以在有限的时间内缓存文件以提高性能)。