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

C# 在发布到Azure Blob存储时,偶尔会出现400错误请求错误,c#,http-status-code-400,azure-storage-blobs,C#,Http Status Code 400,Azure Storage Blobs,我正在使用Azure Blob存储来缓存某些计算的中间结果。这一切都非常有效,只是Azure blob存储客户端偶尔会返回如下错误: public void Upload(string fileName, T entity) { try { var blockBlob = _blobContainer.GetBlockBlobReference(fileName); using (var stream = _serializer.Serialize

我正在使用Azure Blob存储来缓存某些计算的中间结果。这一切都非常有效,只是Azure blob存储客户端偶尔会返回如下错误:

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;
    }
}
远程服务器返回错误:(400)请求错误。

所讨论的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;
    }
}
文件名
可能类似于“4110\GetNodesForPathAnalysis”(在其他情况下可用),而
\u containerName
可能是“SegmentedId”(在其他情况下也可用)。我知道这个400错误的常见原因——一个已经咬了我几次的错误——是一个违反规则的容器或blob名称,但这里的情况似乎不是这样

该错误是暂时的-如果我刷新显示该对象的页面,该对象(具有相同的容器和文件名)将正确上载到Azure Blob存储


有什么建议吗?

您可以使用重试策略和超时设置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);
然后我们可以在say PutBlock中指定这个选项变量作为上传操作的一部分。 这里有一篇详细的文章,讨论如何创建要上传的数据块,然后以并行和异步的方式上传到blob存储。这里是链接-

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

我会使用一个暂时性故障重试块,@Tony-我会试一试,然后发回这里。我们通常会设置一个配置文件来立即重试,然后进行逐步后退重试,这取决于您是否需要回复。您可以将它设置为另一个进程,并让它继续尝试,这样它就不会阻塞用户流。不过这取决于你的需要。谢谢。这基本上就是我最后要做的:在一段合适的时间后重试。在我完成重试后,错误消失了。