提前感谢您的时间和帮助。
我正在使用Azure客户端库(即CloudStorageAccount - CloudBlobClient - CloudBlob)在WPF应用程序中下载/上传blob。
我想在我的WPF客户端应用程序中设置一个超时会话,以中止尝试获取云blob。这与我可以在blob传输会话上设置的服务器端超时不同。我想这样做,因为使用应用程序的互联网连接具有非常不稳定的间歇性连接。
换句话说,我尝试在实际数据传输之前执行BlobContainer.FetchAttributes来检查互联网连接。如果没有连接,我不想在超时之前等待90多秒并抛出异常。
我已经尝试在BlobRequestOptions中设置超时但这不起作用,因为只有在我连接后它才适用。
我是否理解设置错误或者我需要设置/配置/代码以实现更快的超时?
我可以在Fiddler中看到StorageClient库在幕后使用HTTP,并且根据我读过的一些帖子,我尝试在app.config中设置超时,如下所示。这也不起作用。
<configuration>
<system.web>
<httpRuntime executionTimeout="5" />
</system.web>
</configuration>
使用BlobRequest选项的示例超时:
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
blobContainer = blobClient.GetContainerReference("abcd");
CloudBlob blob = blobContainer.GetBlobReference(aCloudPath);
BlobRequestOptions bro = new BlobRequestOptions()
{ Timeout = TimeSpan.FromSeconds(5) };
blob.DownloadToFile(aLocalPath, bro);
这两个选项都不起作用!!
答案 0 :(得分:3)
首先,在app.config中更改httpRuntime executionTimeout将不起作用。这是ASP.NET使用服务器端的设置。
其次,使用BlobRequestOptions的代码应该有效,但有一点需要注意。默认情况下,BlobClient附带一个指数退避重试策略来处理瞬态条件(即:无网络访问)。在每次重试之间它会等待一段时间然后重试。
如果要在尝试检查网络访问时禁用此功能,则只需禁用重试策略:
blobClient.RetryPolicy = () =>
{
return (int currentRetryCount, Exception lastException, out TimeSpan retryInterval) =>
{
retryInterval = TimeSpan.Zero;
return false;
};
};
请务必仅在测试网络访问时禁用此功能,请勿针对实际请求禁用此功能。
哦,顺便说一下,为什么不简单地使用已经存在的东西来检查互联网连接? Windows中有一些API,例如InternetCheckConnection。
如果您的连接不稳定,最好改进重试策略而不是禁用它(例如,请查看TOPAZ)。