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