【问题标题】:can't get ADLS Gen2 REST continuation token to work无法使 ADLS Gen2 REST 继续令牌工作
【发布时间】:2019-05-14 02:54:46
【问题描述】:

我正在尝试从 ADLS Gen2 中检索文件和文件夹列表。我可以获取前 5000 个项目,但是当我使用 continuation 获取其余项目(大约 17,000 个项目左右)时,我收到错误 403(禁止)。根据文档,我将延续令牌添加到 URI 和签名字符串中的规范化资源。但是,我无法让它工作。

我已阅读有关 ADLS Gen2 REST 调用的文档以及我能找到的任何内容,但我无法找出问题所在。

var date = System.DateTime.UtcNow.ToString("R");
string toSign = DefaultSignatureString(date);
toSign +=
    $"/{storageaccountname}/{filesystemname}" + "\n" +
    $"directory:{dir}" +"\n" +
    "recursive:true" + "\n" +
    "resource:filesystem";

var signedSignature = SignData(accessKey, toSign);
var uri = $"https://{storageaccountname}.dfs.core.windows.net/{filesystemname}?directory={dir}&recursive=true&resource=filesystem";

HttpWebResponse response = GetWebResponse(storageaccountname, date, signedSignature, uri);
var token_continuation = response.Headers["x-ms-continuation"];
//I get the token_continuation and repeat the previous steps, adding the continuation part:
while (token_continuation != null)
{
    date = System.DateTime.UtcNow.ToString("R");
    toSign = DefaultSignatureString(date);
    toSign +=
        $"/{storageaccountname}/{filesystemname}" + "\n" +
        $"continuation:{token_continuation}" + "\n" +
        $"directory:{dir}" + "\n" +
        "recursive:true" + "\n" +
        "resource:filesystem";

    signedSignature = SignData(accessKey, toSign);
    uri = $"https://{storageaccountname}.dfs.core.windows.net/{filesystemname}?directory={dir}&recursive=true&resource=filesystem&continuation={token_continuation}";
    response = GetWebResponse(storageaccountname, date, signedSignature, uri);
    token_continuation = response.Headers["x-ms-continuation"];
}


//this is my GetWebResponse method
private static HttpWebResponse GetWebResponse(string storageaccountname, string date, string signedSignature, string uri, string continuation = null)
    {
        WebRequest request = WebRequest.Create(uri);
        if (continuation != null)
        {
            request.Headers.Add($"x-ms-continuation:{continuation}");
        }
        request.Headers.Add($"x-ms-date:{date}");
        request.Headers.Add($"x-ms-version:2018-11-09");
        request.Headers.Add($"Authorization:SharedKey {storageaccountname}:{signedSignature}");
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        return response;
    }

正如我所说,我得到的第一个响应是好的;当我进入while循环时,我得到了错误。我做错了什么?

【问题讨论】:

    标签: rest azure-data-lake


    【解决方案1】:

    终于弄明白了:大多数情况(如果不是全部的话)延续令牌在最后返回“==”,它把 uri 弄乱了。对于uri,我逃避它们;对于规范化的资源,我将字符串保持原样。

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2020-02-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多