TAzureBlobService->GetBlob 在大文件上失败

TAzureBlobService->GetBlob fails on big files

我正在使用 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秒

代码只是建立了一个TAAzureBlobService(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"", 0, 0, false, props, metadata, MemoryStream, CloudResponseInfo);
}
catch (Exception &exception)
{
    Result = exception.Message;
    return false;
}

Result = CloudResponseInfo->StatusMessage;
return true;

(zUPairList 是长系统配对列表的 typedef 类)

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

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

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

A Get Blob operation is allowed 2 minutes per MiB to complete. If the operation is taking longer than 2 minutes per MiB on average, the operation will time out.

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

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

Service->Timeout = 180;

更多信息请参考the documentation