/// <summary> /// Byte Range Response /// </summary> /// <param name="content">source content stream</param> /// <param name="range">range header</param> /// <param name="mediaType">MIME</param> /// <exception cref="NotSupportedException"></exception> public ByteRangeResponse(Stream content, RangeHeaderValue range, string mediaType) { if (!range.Unit.Equals("BYTES",StringComparison.InvariantCultureIgnoreCase)) { throw new NotSupportedException(); } if (!range.Any()) { throw new ArgumentException("range"); } if (string.IsNullOrEmpty(mediaType)) { mediaType = MimeTypes.GetMimeType("application/octet-stream"); } var contentLength = content.Length - content.Position; var itemCount = range.RangeItemHeaderValues.Count(); if (itemCount == 1) { var rangeItem = range.First(); base.Contents = x => { var temStream = new ByteRangeStream(content, rangeItem); temStream.CopyTo(x); }; base.ContentType = mediaType; base.Headers.Add("Content-Range", $"{range.Unit} {rangeItem.From}-{rangeItem.To}/{contentLength}"); base.StatusCode = HttpStatusCode.PartialContent; } else { throw new NotSupportedException(); } }