0

我正在使用 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"", 0, 0, false, props, metadata, MemoryStream, CloudResponseInfo);
}
catch (Exception &exception)
{
    Result = exception.Message;
    return false;
}

Result = CloudResponseInfo->StatusMessage;
return true;

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

中间的117M有时会失败,有时会成功,所以这不是大小问题。所有失败都超过 30 秒,所以它一定是某个地方的时间限制。

4

2 回答 2

0

虽然底层 HTTP 连接设置了各种超时,都等于 60 秒(有关这些默认值之一的示例,请参阅此文档页面),但重要的一个,Azure 超时,默认超时为 30 秒。

因此,您的示例代码缺少的是这样的,Service您的TAzureService参考在哪里:

Service->Timeout = 180;

请参阅文档以获取更多信息。

于 2021-03-17T19:36:29.713 回答
0

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

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

Get Blob 操作允许每 MiB 2 分钟完成。如果该操作平均每 MiB 花费超过 2 分钟,则该操作将超时。

于 2021-03-12T06:35:04.640 回答