首页 > 解决方案 > 如何使用 ASP.NET MVC 进行异步/等待视频流?

问题描述

最近我阅读了这篇关于视频流的文章 ( https://blogs.ibs.com/2017/01/24/streaming-video-content-to-a-browser-using-web-api )。

文章中提供的解决方案效果很好,但我想知道是否有任何 async / await 替代方案,因为文章只显示了一个围绕它构建的解决方案HttpResponseMessage并且我担心性能问题?

标签: asp.netasp.net-mvcasp.net-web-apivideo-streaming

解决方案


性能方面应该没有问题。

使用 async await 不会带来太大的改进。已经在FileStreamer访问文件流时利用了异步操作。

如果您坚持使用 async await,您可以考虑将操作的主体包装在 a 中Task.Run并让操作返回 a Task<HttpResponseMessage>

这里真的不需要过早的优化。

查看任何潜在的阻塞调用并进行相应的重构

例如

public async Task<IHttpActionResult> Get(string filename) {

    var filePath = await GetFilePathAsync(filename);
    if (!File.Exists(filePath))
        return NotFound();

    var response = getResponse(filePath);

    return ResponseMessage(response);
}

private HttpResponseMessage getResponse(string filePath) {
    var response = Request.CreateResponse();
    response.Headers.AcceptRanges.Add("bytes");

    var streamer = new FileStreamer();
    streamer.FileInfo = new FileInfo(filePath);
    response.Content = new PushStreamContent(streamer.WriteToStream, GetMimeType(filePath));

    RangeHeaderValue rangeHeader = Request.Headers.Range;
    if (rangeHeader != null) {
        long totalLength = streamer.FileInfo.Length;
        var range = rangeHeader.Ranges.First();
        streamer.Start = range.From ?? 0;
        streamer.End = range.To ?? totalLength - 1;

        response.Content.Headers.ContentLength = streamer.End - streamer.Start + 1;
        response.Content.Headers.ContentRange = new ContentRangeHeaderValue(streamer.Start, streamer.End,
            totalLength);
        response.StatusCode = HttpStatusCode.PartialContent;
    } else {
        response.StatusCode = HttpStatusCode.OK;
    }
    return response;
}

推荐阅读