[英]How to do async / await video streaming with ASP.NET MVC?
最近,我阅读了有关视频流的这篇文章( https://blogs.ibs.com/2017/01/24/streaming-video-content-to-a-browser-using-web-api )。
文章中提供的解决方案效果很好,但我想知道是否存在任何异步/等待替代方案,因为本文仅显示了围绕HttpResponseMessage
构建的解决方案,我担心性能问题吗?
性能上应该没有问题。
使用异步等待不会带来很多改进。 FileStreamer
在访问文件流时已经利用了异步操作。
如果您坚持使用异步等待,则可以考虑将动作的主体包装在Task.Run
,并使动作返回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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.