Asp.net web api 在WebAPI中使用PushStreamContent时,如何满足多字节范围?

Asp.net web api 在WebAPI中使用PushStreamContent时,如何满足多字节范围?,asp.net-web-api,Asp.net Web Api,我需要使用PushStreamContent,因为我的数据源(实际上必须连接blob),但我还必须支持多字节范围的请求(与存储的blob不对齐的任意范围)。我不清楚的是,我是否可以使用PushStreamContent生成multipart/byteranges响应,如果每个范围需要在响应中分开,如果是,如何做,以及它与PushStreamContent调用的分块传输编码的关系。您可以使用MultipartContent这样做: public class MyRangeController :

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

您可以使用
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;
    }
}