невозможно получить токен продолжения REST ADLS Gen2 - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь получить список файлов и папок из ADLS Gen2. Я могу получить первые 5000 предметов, но когда я использую продолжение, чтобы получить остальные (около 17000 предметов или около того), я получаю ошибку 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, я получаю ошибку. Что я делаю не так?

1 Ответ

1 голос
/ 13 мая 2019

Наконец-то это выяснилось: в большинстве случаев (если не во всех) токен продолжения возвращается с "==" в конце, и он портит URI.Ури, я убегаю от них;для канонизированных ресурсов я оставляю строку как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...