Проблемы с авторизацией в Autodesk Forge при одновременной загрузке файлов

У меня проблемы с авторизацией Autodesk Forge. Иногда я получаю 401 при звонке oss/v2/buckets/{key}/objects/{object}. Это происходит нечасто, но стоит упомянуть, что один из способов, которым я смог воспроизвести это, был при попытке загрузить два идентичных файла одновременно с двух разных клиентов.

Этот сценарий обычно работает, или, если процитировать Брайана Фантану -

60% времени он работает каждый раз.

Как решить эту проблему? Некоторые рекомендации были бы очень полезны.

Заранее спасибо.


person muchos_nachos    schedule 23.05.2017    source источник
comment
Сколько времени занимает этот вызов API для ваших файлов? Если это занимает более 30 минут, то токен, который вы использовали, следует обновить до истечения срока действия.   -  person Eason Kang    schedule 24.05.2017
comment
Спасибо за ответ. Размер файла был 155 МБ и занял ок. 2 минуты на загрузку. Может ли быть ограничение на стороне Autodesk при одновременной загрузке?   -  person muchos_nachos    schedule 24.05.2017
comment
Не могли бы вы проверить общий размер загруженных файлов в вашей корзине Forge? По моему опыту, невозможно загрузить файл размером более 20 МБ с помощью API oss/v2/buckets/{key}/objects/{object}.   -  person Eason Kang    schedule 24.05.2017
comment
Дополнительное напоминание: просто проверьте размер одного файла, вызвавшего эту проблему. Я виноват, неправильно написал...   -  person Eason Kang    schedule 24.05.2017
comment
Спасибо за вашу помощь. Кстати, может ли быть так, что средство просмотра поддерживает только некоторые версии Revit?   -  person muchos_nachos    schedule 29.05.2017
comment
Приятно слышать эту новость. Служба Forge Model Derivative (перевод) поддерживает все версии модели Revit в целом, но рекомендуются файлы rvt, созданные в Revit 2014 и более поздних версиях. По моему опыту, старые файлы rvt могут иметь проблемы совместимости с Revit DB.   -  person Eason Kang    schedule 30.05.2017


Ответы (2)


Приятно слышать, что вы решаете эту проблему самостоятельно. Хотя обновление маркера при каждой загрузке может решить эту проблему сейчас, рекомендуется использовать buckets/:bucketKey/objects/:objectName/resumable для загрузки больших файлов по частям.

Для больших файлов рекомендуется разделить их на несколько небольших частей, называемых фрагментами в официальном document и загруженный buckets/:bucketKey/objects/:objectName/resumable API. Вот пример C# Forge C# SDK для этого API от мой коллега:

private static dynamic resumableUploadFile()
{
  Console.WriteLine("*****Start uploading file to the OSS");
  string path = FILE_PATH;
  if (!File.Exists(path))
       path = @"..\..\..\" + FILE_PATH;

  //File Total size        
  long fileSize = new System.IO.FileInfo(path).Length;
  //Chunk size for separting file into several parts.
  //2MB chuck size is used in this sample.
  long chunkSize = 2 * 1024 * 1024 ;
  //Total amounts of chunks in 2MB size.
  long nbChunks = (long)Math.Round(0.5 + (double)fileSize / (double)chunkSize);

  ApiResponse<dynamic> finalRes = null ;
  using (FileStream streamReader = new FileStream(path, FileMode.Open))
  {
    //Unique id for resumable uploading.
    string sessionId = RandomString(12);
    for (int i = 0; i < nbChunks; i++)
    {
        //Start position in bytes of a chunk
        long start = i * chunkSize;
        //End position in bytes of a chunk
        //(End posistion of the latest chuck is the total file size in bytes)
        long end = Math.Min(fileSize, (i + 1) * chunkSize) - 1;

        //Identify chunk info. to the Forge
        string range = "bytes " + start + "-" + end + "/" + fileSize;
        //Steam size for this chunk
        long length = end - start + 1;

        Console.WriteLine("Uploading range: " + range);

        //Read content stream into a meomery stream for this chunk
        byte[] buffer = new byte[length];
        MemoryStream memoryStream = new MemoryStream(buffer);

        int nb = streamReader.Read(buffer, 0, (int)length);
        memoryStream.Write(buffer, 0, nb);
        memoryStream.Position = 0;

        //Upload file to the Forge OSS Bucket
        ApiResponse<dynamic> response = objectsApi.UploadChunk(
                                            BUCKET_KEY,
                                            FILE_NAME,
                                            (int)length,
                                            range,
                                            sessionId,
                                            memoryStream
                                        );

        finalRes = response;

        if (response.StatusCode == 202) {
            Console.WriteLine("One chunk uploaded successfully");
            continue;
        }
        else if (response.StatusCode == 200)
        {
            Console.WriteLine("Final chunk uploaded successfully");
        }
        else
        {
            //Some error occurred here
            Console.WriteLine(response.StatusCode);
            break;
        } 
    } 

  }

  return (finalRes);
}

Надеюсь, это поможет.

person Eason Kang    schedule 30.05.2017
comment
Благодарим вас за предоставление этого решения. Он реализован и, кажется, работает нормально. Я добавлю это как правильный ответ. - person muchos_nachos; 31.05.2017

Чтобы решить эту проблему, мне пришлось изменить время истечения срока действия токена, чтобы он всегда обновлялся при каждой загрузке.

person muchos_nachos    schedule 29.05.2017