使用 Java 连接到 Azure Blob 存储服务时出错(状态代码 405,UnsupportedHttpVerb)

Posted

技术标签:

【中文标题】使用 Java 连接到 Azure Blob 存储服务时出错(状态代码 405,UnsupportedHttpVerb)【英文标题】:Error connecting to Azure Blob Storage Service with Java (Status code 405, UnsupportedHttpVerb) 【发布时间】:2021-09-09 07:55:03 【问题描述】:

我正在尝试从 Azure 函数连接到 Azure Blob 存储服务,但它返回的所有内容都是 BlobStorageException

我用了这个例子:Azure Storage Blob client library for Java (Create a BlobServiceClient)

这是我的代码:

String MY_BLOB_ENDPOINT = "https://mystorageaccount.z13.web.core.windows.net/"

String MY_BLOB_SAS_TOKEN = "?sv=2017-07-29&ss=b&srt=s&sp=rwdc&se=2022-06-10T00:00:00Z&st=2021-06-10T00:00:00Z&spr=https&sig=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

String MY_DEFAULT_CONTAINER_NAME = "test"

BlobServiceClient serviceClient = new BlobServiceClientBuilder()
    .endpoint(MY_BLOB_ENDPOINT)
    .sasToken(MY_BLOB_SAS_TOKEN)
    .buildClient();

this.containerClient = serviceClient.
    getBlobContainerClient(MY_DEFAULT_CONTAINER_NAME);

if (!this.containerClient.exists()) 
    this.containerClient.create();

这里是日志:

... (omitted logs)
[2021-06-26T03:36:28.671Z] Executed 'Functions.upload' (Failed, Id=ffdff367-242e-494a-8303-e9ceeee6a2d7, Duration=5919ms)
[2021-06-26T03:36:28.671Z] System.Private.CoreLib: Exception while executing function: Functions.upload. System.Private.CoreLib: Result: Failure
[2021-06-26T03:36:28.671Z] Exception: BlobStorageException: Status code 405,
                           "<!DOCTYPE html>
                            <html>
                              <head>
                                <title>UnsupportedHttpVerb</title>
                              </head>
                              <body>
                                <h1>The resource doesn't support specified Http Verb.</h1>
                                <p>
                                  <ul>
                                    <li>HttpStatusCode: 405</li>
                                    <li>ErrorCode: UnsupportedHttpVerb</li>
                                    <li>RequestId : 05ac7acf-701e-0026-213c-6adf7e000000</li><li>TimeStamp : 2021-06-26T03:36:28.4852611Z</li>
                                  </ul>
                                </p>
                              </body>
                            </html>"
[2021-06-26T03:36:28.671Z] Stack: java.lang.IllegalStateException: Failed to initialize
[2021-06-26T03:36:28.671Z]      at org.springframework.cloud.function.adapter.azure.FunctionInvoker.<init>(FunctionInvoker.java:90)
[2021-06-26T03:36:28.671Z]      at org.springframework.cloud.function.adapter.azure.FunctionInvoker.<init>(FunctionInvoker.java:95)
... (omitted logs)

Blob 存储依赖关系

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.11.1</version>
</dependency>

我不知道为什么它不起作用。我需要配置一些其他设置吗?

【问题讨论】:

这很奇怪!您能否编辑您的问题并包含MY_BLOB_ENDPOINTMY_BLOB_SAS_TOKENMY_DEFAULT_CONTAINER_NAME 的值。请在共享之前混淆帐户名称,sig 部分您的 SAS 令牌。 @GauravMantri 我改变了他们。 谢谢。我已经提供了答案。 HTH。 【参考方案1】:

您收到此错误的原因是您使用了不正确的端点。请尝试更改:

String MY_BLOB_ENDPOINT = "https://mystorageaccount.z13.web.core.windows.net/"

String MY_BLOB_ENDPOINT = "https://mystorageaccount.blob.core.windows.net/"

你不应该得到错误。

本质上https://mystorageaccount.z13.web.core.windows.net/ 是用于访问static website hosted in Azure Blob Storage 的特殊端点。此端点映射到 $web blob 容器。

要对 blob 容器和 blob 执行任何操作,您将需要使用应类似于 https://mystorageaccount.blob.core.windows.net/ 的 blob 端点。

【讨论】:

确实如此。现在它在本地运行良好,但是当我将它部署到 Azure 时,在 Application Insights 中我得到了这个 error message 这与函数时区有关吗? 您可以编辑您的问题并包含生成 SAS 的代码吗?另外,您的 Azure Function 的时区是什么? 它在 UTC-0 时区,我使用 Terraformstart: 2021-06-10T00:00:00Zexpiry: 2022-06-10T00:00:00Z 日期生成了 SAS 令牌 你能分享确切的错误信息吗?我建议为此发布一个单独的问题。谢谢。【参考方案2】:

检查您提供的 SAS 密钥是否有效或允许访问存储帐户中的 blob

【讨论】:

我使用Terraform 部署我的存储帐户并生成一个 SAS 令牌(来自此link)我只更改了start/expiration 日期和权限设置@987654325 @、readwritedelete 是允许的唯一权限。

以上是关于使用 Java 连接到 Azure Blob 存储服务时出错(状态代码 405,UnsupportedHttpVerb)的主要内容,如果未能解决你的问题,请参考以下文章

将 DataBricks 连接到 Azure Blob 存储

C# MVC Web 应用服务连接到 Azure 存储 Blob

将存储安全地连接到 Azure Data Lake Analytics 或数据工厂

是否有任何选项可以连接到 Azure Tables 以从 Camel 存储和检索数据?

用于连接到虚拟机并运行 azcopy 的 Azure 逻辑应用

Azure 数据工厂到 Azure Blob 存储权限