使用 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_ENDPOINT
、MY_BLOB_SAS_TOKEN
和MY_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 时区,我使用Terraform
和 start: 2021-06-10T00:00:00Z
和 expiry: 2022-06-10T00:00:00Z
日期生成了 SAS 令牌
你能分享确切的错误信息吗?我建议为此发布一个单独的问题。谢谢。【参考方案2】:
检查您提供的 SAS 密钥是否有效或允许访问存储帐户中的 blob
【讨论】:
我使用Terraform
部署我的存储帐户并生成一个 SAS 令牌(来自此link)我只更改了start
/expiration
日期和权限设置@987654325 @、read
、write
和 delete
是允许的唯一权限。以上是关于使用 Java 连接到 Azure Blob 存储服务时出错(状态代码 405,UnsupportedHttpVerb)的主要内容,如果未能解决你的问题,请参考以下文章
将 DataBricks 连接到 Azure Blob 存储
C# MVC Web 应用服务连接到 Azure 存储 Blob
将存储安全地连接到 Azure Data Lake Analytics 或数据工厂
是否有任何选项可以连接到 Azure Tables 以从 Camel 存储和检索数据?