【发布时间】:2015-09-08 05:30:13
【问题描述】:
我们创建了很多 csv 文件并将它们存储在一个 azure blob 容器中。创建所有文件后,应将它们下载到 vpn 内的某个位置。这在大多数情况下都可以正常工作,但可能会发生某些文件比预期小得多的情况。
文件的平均大小约为 40 mb,有时文件在 7 到 30 mb 之间。这是到目前为止的代码:
private void DownloadBlobToFile(ICloudBlob blob, string fileName)
{
_log.Debug("DownloadBlobToFile");
Contract.Requires<ArgumentNullException>(blob == null, "blob must not be null.");
Contract.Requires<ArgumentNullException>(string.IsNullOrWhiteSpace(fileName), "fileName must not be null or empty.");
using (var fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
{
blob.DownloadToStream(fileStream, null, GetBlobRequestOptions());
_log.Info(string.Format("File {0} successfully downloaded.", fileStream.Name));
}
}
private BlobRequestOptions GetBlobRequestOptions()
{
if (_blobRequestOptions != null)
{
return _blobRequestOptions;
}
_blobRequestOptions = new BlobRequestOptions
{
ServerTimeout = TimeSpan.FromSeconds(60),
MaximumExecutionTime = TimeSpan.FromSeconds(180),
RetryPolicy = new ExponentialRetry(TimeSpan.FromSeconds(3), 5)
};
return _blobRequestOptions;
}
当文件下载不完整时,根本没有错误消息。 检查文件是否已成功并完全下载的最佳程序是什么?
【问题讨论】:
-
Azure 存储客户端库有多种方法可以检查 blob 下载是否成功。例如,如果下载的字节数与 Content-Length 标头不匹配,则会抛出异常。那么,您是否在服务器端检查了 blob 是否实际完成,这意味着上传实际上是否成功?
-
当然我检查了大小。完全没有例外,但文件之间的差异高达 30mb。看起来这是一个网络延迟问题。也许下载有效,但无法在目标位置创建文件?检查下载是否已完成的其他可能方法是什么?
-
如果文件创建失败,FileStream 会抛出异常。如果下载的字节数不正确,DownloadToStream 会抛出异常。您是否尝试过运行 Fiddler 并查看服务器为 Content-Length 返回的内容?
-
失败的情况并不常见。这些进程每小时运行一次,三天左右就会失败一次。所以很难复制。无论如何,谢谢你会试一试。
-
设置 MaximumExecutionTime = TimeSpan.FromSeconds(180) 可能太短而无法完成下载。在那之后执行时间下载将被终止!所以,把这个设置为TimeSpan.FromMinutes(60),应该就够了。
标签: azure blob azure-storage