#c# #azure #asp.net-core #azure-storage #azure-blob-storage
#c# #azure #asp.net-core #azure-хранилище #azure-blob-storage
Вопрос:
я разрабатываю приложение с помощью .net Core. Я использую хранилище Azure для своих файлов. Но иногда код выдает ожидание: указанный большой двоичный объект не существует.
Так я начинаю процесс загрузки файла:
entity = FileUploadBusinessRule.UploadFile(entity, companyInformationEntityRequestDto.BusinessLicenseBase64,
"BusinessLicenseUrl");
entity = FileUploadBusinessRule.UploadFile(entity, companyInformationEntityRequestDto.CompanyLogoBase64,
"CompanyLogoUrl");
FileUploadBusinessRule.uploadFile:
public static class FileUploadBusinessRule
{
public static T UploadFile<T>(T entity, string file, string propName)
{
IStorageService _storageService = DependencyContainerHelper.Container.Resolve<IStorageService>();
Type t = entity.GetType();
var propertyValue = t?.GetProperty(propName)?.GetValue(entity)?.ToString();
if (!file.IsNullOrEmpty())
{
if (file.Contains("http://") || file.Contains("https://"))
return entity;
if (!propertyValue.IsNullOrEmpty())
_storageService.DeleteBlobData(propertyValue);
t?.GetProperty(propName)?.SetValue(entity, _storageService.UploadFileByBase64String(file));
}
else
{
if (!propertyValue.IsNullOrEmpty())
_storageService.DeleteBlobData(propertyValue);
}
return entity;
}
}
_storageService.UploadFileByBase64String:
public string UploadFileByBase64String(string strBase64)
{
var byteArray = strBase64.Base64ToByteArray();
var mimeType = strBase64.GetMIMETypeFromBase64();
var fileName = Guid.NewGuid().ToString() "." strBase64.GetExtensionFromBase64();
return this.UploadFile(fileName, byteArray, mimeType);
}
uploadFile:
public string UploadFile(string strFileName, byte[] fileData, string fileMimeType)
{
try
{
var _task = Task.Run(() => this.UploadFileToBlobAsync(strFileName, fileData, fileMimeType));
_task.Wait();
string fileUrl = _task.Resu<
return fileUrl;
}
catch (Exception ex)
{
throw (ex);
}
}
UploadFileToBlobAsync:
private async Task<string> UploadFileToBlobAsync(string strFileName, byte[] fileData, string fileMimeType)
{
try
{
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(accessKey);
CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
string strContainerName = "files";
CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference(strContainerName);
string fileName = this.GenerateFileName(strFileName);
if (await cloudBlobContainer.CreateIfNotExistsAsync())
{
await cloudBlobContainer.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Container });
}
if (fileName != null amp;amp; fileData != null)
{
CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(fileName);
cloudBlockBlob.Properties.ContentType = fileMimeType;
await cloudBlockBlob.UploadFromByteArrayAsync(fileData, 0, fileData.Length);
return cloudBlockBlob.Uri.AbsoluteUri;
}
return "";
}
catch (Exception ex)
{
throw ex;
}
}
Когда код выполняет первую строку (entity = FileUploadBusinessRul … blabla), приложение может успешно загрузить файл. Но когда выполняется вторая строка, она выдает исключение в этой строке:
if (await cloudBlobContainer.CreateIfNotExistsAsync())
Я пробовал те же файлы, но он все равно выдает исключение. Кроме того, даже если я завернул блок try-catch, приложение останавливается.
Комментарии:
1.
The specified blob does not exist
Вы можете попробовать использовать инструмент fiddler etc, чтобы перехватить запрос и проверить, какой запрос вызывает ошибку 404.2. Проверьте, удаляет ли его другое приложение?
3. Когда вы говорите,
await cloudBlobContainer.CreateIfNotExistsAsync()
генерирует исключение, что это за исключение? Это не может быть «большой двоичный объект не существует», поскольку вы выполняете операцию с контейнером!4. Боковое примечание: «даже если я завернул блок try-catch, приложение останавливается» — Глядя на ваш блок try catch, вы просто переназначаете его, что так же хорошо, как если бы его вообще не было (что еще хуже, так как вы делаете
throw ex
, что приведет к потере трассировки стека на верхнем уровне)! Конечно, это не помогает 🙂5. Еще одно замечание: почему вы смешиваете асинхронный и неасинхронный код? В методе uploadFile, способе, которым вы вызываете асинхронный код по задаче. Запуск и ожидание, честно говоря, несколько изворотливы. У вас должна быть либо полная асинхронность, либо ее вообще не должно быть (хотя не так много причин не использовать асинхронность). Вы можете прочитать больше об асинхронности learn.microsoft.com/en-us/dotnet/csharp/programming-guide /…