微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TAzureBlobService->GetBlob 在大文件上失败

如何解决TAzureBlobService->GetBlob 在大文件上失败

我正在使用 TAzureBlobService->GetBlob() 在 Azure 中打开文本文件。超过100M的文件失败;它在 30 秒后失败,并显示“与服务器的连接异常终止”。 文件很好,其他应用程序(在其他编译器中)很高兴。 GetBlob() 是否有大小或时间阈值?

3 月 13 日 ---

我已经发布了一个小表单应用程序(RAD Studio 10.2.3)来演示这里的问题 https://www.dropbox.com/s/lbywja0f6ss4o22/GetBlobTest.zip?dl=1 它包含带有三个测试文件(Test52M.txt、Test117M.txt、Test186M.txt)的测试存储帐户的密钥。 小的总是成功,中间的有时会失败,大的总是失败。 失败总是超过 30 秒,成功总是少于 30 秒。

代码只是建立了一个TAzureBlobService(zip里面的key),然后核心代码是:

// Create a MemoryStream for GetBlob to fill
if(MemoryStream) delete MemoryStream;
MemoryStream = new TMemoryStream();

try
{
    zUPairList props,Metadata;
    Service->GetBlob(CtnrName,bname,L"",false,props,Metadata,MemoryStream,CloudResponseInfo);
}
catch (Exception &exception)
{
    Result = exception.Message;
    return false;
}

Result = CloudResponseInfo->StatusMessage;
return true;

(zUPairList 是长系统pairlist 类的typedef)

间的117M有时会失败,有时会成功,所以不是大小问题。 所有失败都超过 30 秒,所以它必须是某个时间限制。

解决方法

如果没有更多信息,听起来您的连接可能存在稳定性问题,因为您收到的是终止而不是返回的错误。您可以在此处查看 GetBlob 的超时规则:

https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob

Get Blob 操作允许在每 MiB 2 分钟内完成。如果操作平均每个 MiB 花费的时间超过 2 分钟,操作将超时。

,

虽然底层 HTTP 连接设置了各种超时值,所有超时值均等于 60 秒(有关这些默认值之一的示例,请参阅 this documentation page),但重要的是 Azure 超时值的默认超时值是 30秒。

因此,您缺少的示例代码是这样的,其中 Service 是您的 TAzureService 引用:

Service->Timeout = 180;

有关详细信息,请参阅 the documentation

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。