public Task <HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { return(Task.Run(async() => { // Hallar el mime type segun la extension del nombre del archivo //var contentType = MimeMapping.GetMimeMapping(Path.GetExtension(_tipoDeArchivo)); string contentType = _archivoParaStremear.TipoArchivo == TipoArchivo.Imagen ? "image/jpeg" : "video/mp4"; HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); if (_rangeHeader == null || !_rangeHeader.Ranges.Any()) { response.Content = new PushStreamContent(WriteToStreamFull, contentType); return response; } else { long start = 0, end = 0, totalLenght; totalLenght = await _archivoBusiness.StreamArchivoGetLenght(_archivoParaStremear); // 1. If the unit is not 'bytes'. // 2. If there are multiple ranges in header value. // 3. If start or end position is greater than file length. if (_rangeHeader.Unit != "bytes" || _rangeHeader.Ranges.Count > 1 || !MediaStreamHelper.TryReadRangeItem(_rangeHeader.Ranges.First(), totalLenght, out start, out end)) { response.StatusCode = HttpStatusCode.RequestedRangeNotSatisfiable; response.Content = new StreamContent(Stream.Null); // No content for this status. response.Content.Headers.ContentRange = new ContentRangeHeaderValue(totalLenght); response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); return response; } var contentRange = new ContentRangeHeaderValue(start, end, totalLenght); // We are now ready to produce partial content. response.StatusCode = HttpStatusCode.PartialContent; response.Content = new PushStreamContent(async(outputStream, httpContent, transpContext) => { await WriteToStreamRange(outputStream, httpContent, transpContext, start, end); }, contentType); response.Content.Headers.ContentLength = end - start + 1; response.Content.Headers.ContentRange = contentRange; return response; } }, cancellationToken)); }
public async Task StreamArchivoRange(Archivos archivoParaBuscar, Stream outputStream, long start, long end) { using (SportsGoEntities context = new SportsGoEntities(false)) using (DbContextTransaction transaction = context.Database.BeginTransaction()) { ArchivosRepository archivoRepo = new ArchivosRepository(context); using (Stream source = await archivoRepo.StreamArchivo(archivoParaBuscar)) { MediaStreamHelper.CreatePartialContent(source, outputStream, start, end); } } }