#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
, в котором вы найдете свой неверный запрос.