在WebAPI中使用PushStreamContent时如何满足多个字节范围?

时间:2018-02-23 23:16:57

标签: asp.net-web-api

我需要使用PushStreamContent因为我的数据源(实际上必须连接blob),但我还必须支持多字节范围的请求(任意范围不与存储的blob对齐)。我不清楚的是,如果我可以使用PushStreamContent生成multipart/byteranges响应,如果每个范围需要在响应中分开,如果是,则如何执行,以及如何关联到PushStreamContent调用的分块传输编码。

1 个答案:

答案 0 :(得分:1)

你可以使用MultipartContent这样做:

public class MyRangeController : ApiController
{
    [HttpGet]
    public HttpResponseMessage Get()
    {
        // Create a multi-part content object for the response; note that per RFC spec, subtype must be "byteranges"
        // Note that the content type of the over-all response will be "multipart/byteranges"
        // We choose to use a GUID string for the separator; it could be anything suitable.
        var multipartContent = new MultipartContent("byteranges", Guid.NewGuid().ToString("D"));

        // Create the response object and set its content
        var response = new HttpResponseMessage(HttpStatusCode.PartialContent) { Content = multipartContent };

        foreach (var rangeItemHeaderValue in Request.Headers.Range.Ranges)
        {
            // Create  PushStreamContent object for our current byte range...
            var pushStreamContent = new PushStreamContent((stream1, content, arg3) =>
            {
                // Write to stream1

                stream1.Close();
            });

            // We need to add certain headers to each part of the response
            pushStreamContent.Headers.ContentRange = new ContentRangeHeaderValue(rangeItemHeaderValue.From.Value, rangeItemHeaderValue.To.Value, /* total size of the resource */);
            pushStreamContent.Headers.ContentType = new MediaTypeHeaderValue(/* Set a content type for each part of the response */);

            // Add the part to the multi-part content response
            multipartContent.Add(pushStreamContent);
        }

        return response;
    }
}