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 本身似乎存在一些错误导致了这个问题。
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 本身似乎存在一些错误导致了这个问题。