ошибка 400 при загрузке в хранилище больших двоичных объектов Azure

#c# #azure

#c# #azure

Вопрос:

Мое приложение построено на C # и использует стандартную версию хранилища больших двоичных объектов Azure 2 поколения для загрузки файлов в контейнеры, но у нас было непоследовательное поведение с точки зрения успешной загрузки файлов, поэтому мы решили попробовать премиум-версию, которая имеет уменьшенную задержку.

Из документации, похоже, нет никаких предположений о том, что подход с точки зрения кода должен быть другим. Однако при любой попытке загрузки мы получаем 400 неверных запросов. Мы пытались использовать Sas, но все еще сталкивались с той же проблемой. Я также попытался создать контейнер вручную вместо динамического создания из кода, но все равно столкнулся с той же проблемой.

Вот фрагменты обоих подходов, надеюсь, кто-нибудь сможет указать мне правильное направление

С помощью sas

                     // level APIs
                    AccountSasBuilder sas = new AccountSasBuilder
                    {
                        // Allow access to blobs
                        Services = AccountSasServices.Blobs,

                        // Allow access to the service level APIs
                        ResourceTypes = AccountSasResourceTypes.Service,

                        // Access expires in 1 hour!
                        ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
                    };
                    // Allow read access
                    sas.SetPermissions(AccountSasPermissions.All);

                    // Create a SharedKeyCredential that we can use to sign the SAS token
                    StorageSharedKeyCredential credential = new StorageSharedKeyCredential(StorageName,StorageKey);

                    // Build a SAS URI
                    UriBuilder sasUri = new UriBuilder(StorageURL);
                    sasUri.Query = sas.ToSasQueryParameters(credential).ToString();

                    // Create a client that can authenticate with the SAS URI
                    BlobServiceClient service = new BlobServiceClient(sasUri.Uri);

                    //var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["AzureWebJobsStorage"]);
                    //var client = storageAccount.CreateCloudBlobClient();

                    var blobContainer = service.GetBlobContainerClient(container);
                    //blobContainer.CreateIfNotExists(PublicAccessType.BlobContainer);
                    var blockBlob = blobContainer.GetBlobClient(file.Substring(file.LastIndexOf('/')   1));
                    using (var fileStream = WaitForFile(file, FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        var response = blockBlob.UploadAsync(fileStream).Resu<
                        fileStream.Close();
                    }
  

Без sas

         var client = storageAccount.CreateCloudBlobClient();

        var blobContainer = client.GetContainerReference(container);
        blobContainer.CreateIfNotExists(BlobContainerPublicAccessType.Blob);
                    var blockBlob = blobContainer.GetBlockBlobReference(file.Substring(file.LastIndexOf('/')   1));
                    using (var fileStream = WaitForFile(file, FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        blockBlob.UploadFromStream(fileStream);
                        fileStream.Close();
                    } ```
  

Комментарии:

1. Не могли бы вы подробно описать сообщение об ошибке и перехватить запрос с помощью filddler?

Ответ №1:

Код ошибки соответствует

Неверный запрос BlockListTooLong (400) Список блоков может содержать не более 50 000 блоков.

Здесь перечислены другие коды ошибок:

https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes

Вам необходимо исправить ошибку, уменьшив размер загруженного блочного большого двоичного объекта.

Ответ №2:

Не зная исключения, я бы сказал, что вы можете попасть под следующее условие: https://learn.microsoft.com/en-us/rest/api/storageservices/using-blob-service-operations-with-azure-premium-storage

Учетные записи Premium GPv2 не поддерживают блочные двоичные объекты или службы файлов, таблиц и очередей.

Возможно, вы захотите попробовать с premium BlockBlobStorage :

Однако учетные записи премиум-класса BlockBlobStorage поддерживают блокировку и добавление больших двоичных объектов.

Если нет, попробуйте перехватить исключение. Пользовательское исключение содержит свойство HttpStatusMessage in RequestInformation , в котором вы найдете свой неверный запрос.