gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:15:39 27 4
gpt4 key购买 nike

给定这样的 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、考虑没有范围 header 或具有开放范围的请求等):

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 的结尾)。

最佳答案

至少现在,我已经通过返回 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,但这似乎对我们有用。

关于c# - 在 ASP.NET Web API 2 中,ByteRangeStreamContent 在与来自 Azure 存储的流一起使用时返回不正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55421650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com