【问题标题】:How to do async / await video streaming with ASP.NET MVC?如何使用 ASP.NET MVC 进行异步/等待视频流?
【发布时间】:2018-08-17 06:32:39
【问题描述】:
【问题讨论】:
标签:
asp.net
asp.net-mvc
asp.net-web-api
video-streaming
【解决方案1】:
性能方面应该没有问题。
使用异步等待不会带来太大的改进。 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;
}