ADLS Gen 2 存储 API - 拒绝 Http 动词

ADLS Gen 2 Storage API - Refusing Http Verbs

ADLS Gen 2 API 路径操作中的某些端点出现问题。

我可以很好地创建、列出、获取文件系统的属性和删除文件系统。

但是,将目录添加到文件系统后,某些动词会失败 - HEAD、GET 和 DELETE。

例如,我创建了一个名为c79b0781的文件系统,目录路径为abc/def

Call failed with status code 400 (The HTTP verb specified is invalid - it is not recognized by the server.): DELETE https://myadls.dfs.core.windows.net/c79b0781/abc?recursive=true&timeout=30

对于headers,我有:

x-ms-version: 2018-11-09

我可以从 Azure 存储资源管理器中删除文件系统,但 API 拒绝我的查询。

列表操作也因类似错误而失败

Call failed with status code 400 (The HTTP verb specified is invalid - it is not recognized by the server.): GET https://myadls.dfs.core.windows.net/c79b0781?resource=filesystem&recursive=false&timeout=30

与headers:

x-ms-version: 2018-11-09

最后,我的获取属性也失败了

Call failed with status code 400 (The HTTP verb specified is invalid - it is not recognized by the server.): HEAD https://myadls.dfs.core.windows.net/c79b0781?resource=filesystem&timeout=30

这似乎只有在我向文件系统添加目录时才会发生。

更深入一点:

这个测试有效

PUT https://myadls.dfs.core.windows.net/c79b0781?resource=filesystem
GET https://myadls.dfs.core.windows.net/c79b0781?recursive=false&resource=filesystem
DELETE https://myadls.dfs.core.windows.net/c79b0781?resource=filesystem

我的第二次目录创建测试

PUT https://myadls.dfs.core.windows.net/c79b0781?resource=filesystem
PUT https://myadls.dfs.core.windows.net/c79b0781/abc/123?resource=directory

在此之后,调用开始拒绝 HTTP 动词

GET https://myadls.dfs.core.windows.net/c79b0781?recursive=false&resource=filesystem

仔细检查我的目录创建请求,它看起来像这样:

PUT https://myadls.dfs.core.windows.net/c79b0781/abc/123?resource=directory

与Headers:

Authorization: [omitted]
Content-Length: 0

而且我可以在存储资源管理器中看到这些文件夹,但之后我就无法对它们进行操作了。

测试用例 2

我已经开始了一条路,想知道它是否是权限。因此,我通过 Azure 存储资源管理器创建了一个新的文件系统,其中包含 abc/def 文件夹结构。

测试 1(及格)

Get List for directory "abc"
Get List for directory "abc/def"

测试 2(失败)

Create Directory "uvw/xyz"
Get List for directory "abc" Fails here
Get List for directory "abc/def"
Get List for directory "uvw/xyz"

一旦我通过 api 创建目录,就好像整个文件系统开始拒绝所有 HTTP 请求。

这个错误最终导致我陷入了我用于执行休息请求的 Flurl 实现中。

Put 方法没有主体,正在调用 PutJsonAsync,其中 according to the spec,它期望内容类型为 application/octet-stream,内容长度为 0。

我将对 PutJsonAsync 的调用替换为 PutAsync,一切都神奇地开始工作了。

因此,由于我在包装代码中的误用,Flurl 本身似乎存在一些错误导致了这个问题。