C# 在发布到Azure Blob存储时,偶尔会出现400错误请求错误
我正在使用Azure Blob存储来缓存某些计算的中间结果。这一切都非常有效,只是Azure blob存储客户端偶尔会返回如下错误: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
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-我会试一试,然后发回这里。我们通常会设置一个配置文件来立即重试,然后进行逐步后退重试,这取决于您是否需要回复。您可以将它设置为另一个进程,并让它继续尝试,这样它就不会阻塞用户流。不过这取决于你的需要。谢谢。这基本上就是我最后要做的:在一段合适的时间后重试。在我完成重试后,错误消失了。