在ASP.NET Web API 2中,ByteRangeStreamContent与Azure存储中的流一起使用时返回不正确的数据

问题描述 投票:0回答:1

给定Range这样的请求:

curl -r 0-16 https://example.com/api/blob/mobydick.txt -o moby0.txt -D -

我们得到:

Call me Ishmael.

但像这样的Range请求:

curl -r 16-32 https://example.com/api/blob/mobydick.txt -o moby1.txt -D -

我们仍然得到:

Call me Ishmael.

这是使用以下代码(编辑删除获取blob,计算没有范围标题的请求,或使用开放范围等):

Stream myBlobStream = await myBlob.OpenReadAsync();
HttpResponseMessage message = Request.CreateResponse(HttpStatusCode.PartialContent);
message.Content = new ByteRangeStreamContent(myBlobStream , range, myBlob.Properties.ContentType);
return message;

在我看过的样本中,似乎没有必要手动搜索或设置流的位置,因为(据我所知)应该由ByteRangeStreamContent处理。当我尝试手动将流的位置设置为Range的开头时,结果是不一致的;有时我最终得到一个单字节的文本文件,有时整个文件从Range的开头开始(即,忽略Range的结尾)。

c# asp.net-web-api asp.net-web-api2 azure-storage azure-storage-blobs
1个回答
0
投票

至少现在,我通过返回ByteArrayContent而不是ByteRangeStreamContent来解决这个问题。

// Including my setup of the range values this time:
    var range = Request.Headers.Range;

    long chunkLength = 2500000;
    long? beginRange = range.Ranges.First().From;
    long? endRange = range.Ranges.First().To;

    if (endRange == null)
    {
        if ((beginRange + chunkLength) > myBlob.Properties.Length)
        {
            endRange = myBlob.Properties.Length - 1;
        }
        else
        {
            endRange = beginRange + chunkLength;
        }
    }
    var blobStreamPosition = beginRange.Value;

// Set the stream position
    blobStream.Position = blobStreamPosition;

    int bytesToRead = (int)(endRange - blobStreamPosition + 1);

// Using BinaryReader for convenience
    BinaryReader binaryReader = new BinaryReader(blobStream);
    byte[] blobByteArray = binaryReader.ReadBytes(bytesToRead);
    message.Content = new ByteArrayContent(blobByteArray);

// Don't forget that now you have to set the content range header yourself:
    message.Content.Headers.ContentRange = new ContentRangeHeaderValue(blobStreamPosition, endRange.Value, myBlob.Properties.Length);
    message.Content.Headers.ContentType = new MediaTypeHeaderValue(myBlob.Properties.ContentType);

    binaryReader.Dispose();
    blobStream.Dispose();

老实说,我不知道这个解决方案中潜藏着什么问题;如果没有别的,那个字节数组意味着它应该包含对它将返回的部分响应大小的限制。我宁愿使用ByteRangeStreamContent,但这似乎对我们有用。

© www.soinside.com 2019 - 2024. All rights reserved.