我正在使用Azure Blob存储来缓存某些计算的中间结果。一切都很好,除了偶尔,Azure blob存储客户端返回如下错误:
The remote server returned an error: (400) Bad Request.
有问题的C#代码如下所示:
public void Upload(string fileName, T entity)
{
try
{
var blockBlob = _blobContainer.GetBlockBlobReference(fileName);
using (var stream = _serializer.Serialize(entity))
{
blockBlob.UploadFromStream(stream);
}
}
catch (Exception ex)
{
var json = JsonConvert.SerializeObject(entity).SubstringSafe(0, 500);
_logger.Error("Error uploading object '{0}' of type '{1}' to blob storage container '{2}'; entity='{3}'; error={4}",
fileName,
typeof(T).Name,
_containerName,
json,
ex.CompleteMessage());
throw;
}
}
fileName
可能类似于“4110 \ GetNodesForPathAnalysis”(在其他情况下有效),而_containerName
可能是“segmentedids”(在其他情况下也适用)。我知道这个400错误的常见原因 - 有几次让我感到困惑 - 是一个容器或blob名称违反了The Rules,但这似乎并非如此。
错误是暂时的 - 如果我刷新显示的页面,则对象(具有相同的容器和文件名)将正确上载到Azure Blob存储。
有什么建议吗?
答案 0 :(得分:1)
您可以使用重试策略和超时设置BlobRequestOptions类详细信息 -
//set the blob upload timeout and retry strategy
BlobRequestOptions options = new BlobRequestOptions();
options.ServerTimeout = new TimeSpan(0, 180, 0);
options.RetryPolicy = new ExponentialRetry(TimeSpan.Zero, 20);
然后我们可以在PutBlock中将此选项变量指定为上传操作的一部分。 这里详细介绍了如何创建要上传的数据块,然后以并行和异步方式上传到blob存储。这是链接 -
http://sanganakauthority.blogspot.com/2014/07/upload-large-files-to-azure-block-blob.html
如果不需要异步,则可以使其同步工作。 希望这会有所帮助。