gpt4 book ai didi

Azure Blob 错误 : StorageException: The condition specified using HTTP conditional header(s) is not met

转载 作者:行者123 更新时间:2023-12-02 06:27:03 27 4
gpt4 key购买 nike

所以我有一个函数,只需每 10 分钟从 Blob 存储中下载文本并检查结果。该函数可以运行数天。但它经常(大约每天)失败,然后出现以下错误。

Caused by: com.microsoft.azure.storage.StorageException: The condition specified using HTTP conditional header(s) is not met.

我的代码非常简单。

public String downloadTextBlob(CloudBlobDirectory dir, String filename) {
try {
return dir.getBlockBlobReference(filename).downloadText();
} catch (StorageException | IOException | URISyntaxException e) {
throw new WorkbenchRuntimeException(e.getMessage(), e);
}
}

我发布了同样的问题here ,我对谈论使用 OperationContext 来解决问题的答案很感兴趣。但问题不是关于 Java 的,答案也没有真正解释它实际上在做什么。

这是建议的解决方案(非java代码)

 OperationContext context = new OperationContext();
context.SendingRequest += (sender, e) => {
e.Request.Headers["if-match"] = "*";
};

谁能解释一下这实际上是做什么的?也许我如何在Java中复制这个,我注意到Java azure存储sdk中有一个OperationContext,并且我可以使用操作上下文作为参数来调用.downloadText()。我只是不确定如何处理 OperationContext。

最佳答案

首先,我鼓励您在此处阅读有关 Azure Blob 存储中的条件 header 的信息:https://learn.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations .

我还没有查看 Java SDK 的源代码,但我的猜测是 downloadText() 操作正在幕后执行多个操作。在第一个操作中,它获取 blob 的属性(例如 blob 的长度等),在下一个操作中,它实际上是下载 blob。作为第一个操作的一部分,它还会获取 blob 的 etag,并将相同的 etag 传递给 if-match header 中的第二个操作。

现在,在第一次和第二次操作之间,blob 发生了一些变化,导致 etag 值发生变化。由于第二个请求仍然使用旧的 etag 值,并且 etag 之间不匹配,因此您的请求失败,并出现前提条件失败if-match header 中存在 etag 指示存储服务仅当条件匹配(即 etag 匹配)时才执行操作。由于 etag 不匹配,您会收到此错误。

要解决此问题,您需要使用以下 downloadText() 方法重写:

downloadText(final String charsetName, final AccessCondition accessCondition, BlobRequestOptions options, OperationContext opContext)

并为if-match指定带有“*”值的访问条件,这实际上告诉存储服务忽略etag值。您可以在这里了解有关访问条件的更多信息:https://learn.microsoft.com/en-us/java/api/com.microsoft.azure.storage.accesscondition?view=azure-java-legacy .

您的代码将类似于(未经测试的代码):

AccessCondition accessCondition = AccessCondition.generateIfMatchCondition("*");

并在 downloadText() 方法中使用此访问条件。

关于Azure Blob 错误 : StorageException: The condition specified using HTTP conditional header(s) is not met,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62308525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com