Конечная точка производной модели не загружает большие файлы SDB в виде кусков - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь загрузить большой 3,5 ГБ SDB-файл в SVF-файл из BIM360 с помощью Derivative API. Будучи большим файлом, я пытаюсь загрузить его кусками, как описано здесь эта ссылка

Ниже приведена моя реализация с использованием RestSharp :

static async Task DownloadAsync(string AccessToken, string RemotePath, string folderPath, Tuple<long, long, string> chunck, int retry)
{
    string pathToSave = Path.Combine(folderPath, chunck.Item3 + ".part");
    IRestClient client = new RestClient("https://developer.api.autodesk.com/");

    RestRequest vRequest = new RestRequest(RemotePath, Method.GET);
    vRequest.AddHeader("Authorization", "Bearer " + AccessToken);
    vRequest.AddHeader("Accept-Encoding", "gzip, deflate");
    vRequest.AddHeader("Range", "bytes=" + chunck.Item1 + "-" + chunck.Item2);
    IRestResponse response = await client.ExecuteTaskAsync(vRequest);
    if (response.StatusCode != System.Net.HttpStatusCode.PartialContent)
    {
        Tools.LogWriter("Error");
    }

    else
    {
        File.WriteAllBytes(pathToSave, response.RawBytes);
    }
}

То же, используя WebClient :

static async Task DownloadAsync(string AccessToken, string RemotePath, string folderPath, Tuple<long, long, string> chunck, int retry)
        {
            string pathToSave = Path.Combine(folderPath, chunck.Item3 + ".part");
            var request = (HttpWebRequest)WebRequest.Create("https://developer.api.autodesk.com/" + RemotePath);
            request.Headers.Add("Authorization", "Bearer " + AccessToken);
            request.AddRange(chunck.Item1, chunck.Item2);
            using (var response = await request.GetResponseAsync())
            using (var stream = response.GetResponseStream())
            using (var output = File.Create(pathToSave))
            {
                await stream.CopyToAsync(output);
            }
        }

Использование HttpClient с повторной попыткой:

static async Task DownloadAsync(string AccessToken, string RemotePath, string folderPath, Tuple<long, long, string> chunck, int retry)
{
    try
    {
        string pathToSave = Path.Combine(folderPath, chunck.Item3 + ".part");

        var client = new HttpClient();
        client.DefaultRequestHeaders.Range = new RangeHeaderValue(chunck.Item1, chunck.Item2);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
        using (var stream = await client.GetStreamAsync("https://developer.api.autodesk.com/" + RemotePath))
        using (var output = File.Create(pathToSave))
        {
            await stream.CopyToAsync(output);
        }
    }
    catch (Exception e)
    {
        if (retry !=0)
        {
            await DownloadAsync(AccessToken, RemotePath, folderPath, chunck, retry -1);
        }
        else
        {
            Console.WriteLine("Error Async Download");
        }
    }
}

Загруженные файлы чанков имеют размер 50 Мб и более объединены в один файл SDB. Процедура работает для небольших файлов SDB - от 300 до 2000 МБ - но для этого конкретного файла RestClient перестает получать после загрузки 95% деталей.

Несколько замечаний:

  • Failing куски не всегда одинаковы
  • Сбой процедуры до истечения срока действия маркера доступа.
  • Программа выполняется случайным образом 10% раз.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Мы попробовали решения Брайана с теми же результатами:

  • Хостинг в AWS тоже не удался.

  • Ожидание между запросами изменено на 1000 мс , Произошел случайный сбой деталей

  • Куски по 20 Мб, то же, что и предыдущая точка

Мы решили изменить рабочий процесс, чтобы загрузить файл json и восстановить SDB из них.

0 голосов
/ 13 апреля 2020

Программа запускается случайным образом 10% раз. Неудачные чанки не всегда одинаковы

Ваш код выглядит нормально, так что это выглядит как нестабильная / медленная работа сети, которая мешает ...

Наши конечные точки будут иметь время, если ваш запросы слишком долго заканчиваются sh или прерываются из-за проблем с соединением ...

Процедура завершается неудачно до истечения срока действия маркера доступа.

Перед тем, как вы вызовете каждый запрос можете проверить, не истек ли токен, скажем, вы можете разбить токен на точки и декодировать вторую часть содержимого base64, чтобы увидеть, когда он истечет:

//eyJhbGciOiJIUzI1NiIsImtpZCI6Imp3dF9zeW1tZXRyaWNfa2V5In0.eyJzY29wZSI6WyJkYXRhOnJlYWQiLCJkYXRhOndyaXRlIiwiYnVja2V0OnJlYWQiLCJkYXRhOmNyZWF0ZSIsImNvZGU6YWxsIl0sImNsaWVudF9pZCI6InpsSHhHSEZyUzBscUpRN1hoZHNoMElxcUdPVmlsTExQIiwiYXVkIjoiaHR0cHM6Ly9hdXRvZGVzay5jb20vYXVkL2p3dGV4cDYwIiwianRpIjoiS09KNkxmNDZERUtuNENUc0JSMEgwNjFaOVYyeERDaTdzSmlVOVhkVnZNTm9aWFV6YkJHUUxvTjJCRTR5UzZ2QiIsImV4cCI6MTU4NjQ5OTU0Nn0.WmBsqYXd74Ka_C2cX4zHEqdj1Exc9HdW2J858bd4rB4

{\"scope\":[\"data:read\",\"data:write\",\"bucket:read\",\"data:create\",\"code:all\"],\"client_id\":\"zlHxGHFrS0lqJQ7Xhdsh0IqqGOVilLLP\",\"aud\":\"https://autodesk.com/aud/jwtexp60\",\"jti\":\"KOJ6Lf46DEKn4CTsBR0H061Z9V2xDCi7sJiU9XdVvMNoZXUzbBGQLoN2BE4yS6vB\",\"exp\":1586499546}

Предложения

  • Разбейте на еще более мелкие чанки, скажем, 30,40 МБ на чанк
  • Подождите несколько запросов, если слишком много чанков запускается параллельно, вы можете достичь лимита рейтинга, подробнее здесь
  • Улучшение / изменение сетевой среды для увеличения пропускной способности
  • Переключите целевой центр обработки данных наших служб на EMEA, если вы находитесь в Европе, см. her e для получения более подробной информации
  • Попробуйте перенести свой код в облако (например, Faas или веб-приложения и т. д. c на AWS, где размещаются наши службы, и вы можете получить больше сока) для повышения производительности сети
...