发布到Azure Blob存储时,偶尔会出现400错误请求错误

时间:2014-06-23 16:57:11

标签: c# http-status-code-400 azure-storage-blobs

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

有什么建议吗?

1 个答案:

答案 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

如果不需要异步,则可以使其同步工作。 希望这会有所帮助。