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

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

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

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

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

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

2 ответа

Решение

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

Для больших файлов рекомендуется разделить их на несколько небольших частей, называемых в официальном документе порциями, и загрузить их buckets/:bucketKey/objects/:objectName/resumable API. Вот пример C# SDK Forge C# для этого 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);
}

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

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

Другие вопросы по тегам