Исключение при асинхронном создании большого двоичного объекта с помощью хранилища Azure - UploadTextAsync - PullRequest
0 голосов
/ 23 мая 2018

В нашем проекте мы использовали версию Azure Storage 6.0.0 и использовали метод UploadTextAsync для создания больших двоичных объектов.После обновления до последней версии функция UploadTextAsync перестала работать и теперь выдает исключение:

"Ссылка на объект не установлена ​​для экземпляра объекта."

Я пробовал разные методы, чтобы заменить его, но все выдают одно и то же исключение.Например:

byte[] fileBytes = Encoding.UTF8.GetBytes(data);
await lockBlob.UploadFromByteArrayAsync(fileBytes, 0, fileBytes.Length);

Единственный способ заставить его работать - это перейти на синхронную версию:

BlobRequestOptions blobOptions = new BlobRequestOptions
{
         MaximumExecutionTime = TimeSpan.FromSeconds(5),
};
lockBlob.UploadText(data, null, null, blobOptions, null);

Как я могу заставить работать асинхронную версию?Есть ли обходной путь?Мне действительно нужна асинхронная версия.

Метод UploadText (async and sync) создает большой двоичный объект, если он еще не существует, и перезаписывает его, если он существует.

Почему он работает сверсия синхронизации, а не асинхронизация с обновлением?

Для создания BLOB-объекта это код:

var container= client.GetContainerReference("lockblobs");
await container.CreateIfNotExistsAsync();
var lockBlob = container.GetBlockBlobReference(data);

1 Ответ

0 голосов
/ 24 мая 2018

решено:

После отладки через стек вызовов в пакете Azure выясняется, что в BlobRequestOptions есть проверка, по умолчанию существует несоответствие между RequireEncryption и EncryptionPolicy.

Это виновник в определении BlobRequestOptions :

internal void AssertPolicyIfRequired()
{
    if (this.RequireEncryption.HasValue && this.RequireEncryption.Value && this.EncryptionPolicy == null)
    {
          throw new InvalidOperationException(SR.EncryptionPolicyMissingInStrictMode);
    }
}

в https://github.com/Azure/azure-storage-net/blob/master/Lib/Common/Blob/BlobRequestOptions.cs

Итак, в основном:

BlobRequestOptions blobOptions = new BlobRequestOptions
{
    MaximumExecutionTime = TimeSpan.FromSeconds(5),
    ParallelOperationThreadCount = 48,
    RequireEncryption = false
};

await lockBlob.UploadTextAsync(data, null, null, blobOptions, null);

Я избегаю проверки в проверке AssertPolicyIfRequired.Итак, нижняя строка, установите RequireEncryption = false или установите его в true, а также определите правильную Политику шифрования.

Это теперь заставляет работать все асинхронные методы Upload ****.

Вотстек вызовов, который помог мне отладить проблему:

{"ClassName":"System.NullReferenceException","Message":"Object reference not set to an instance of an object.","Data":null,"InnerException":null,"HelpURL":null,"StackTraceString":"   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.<>c__DisplayClass1d.b__f(Action continuation) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 620
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.BeginUploadFromStreamHelper(Stream source, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, AsyncCallback callback, Object state) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 665
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.BeginUploadFromStream(Stream source, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, AsyncCallback callback, Object state) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 477
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.BeginUploadFromByteArray(Byte[] buffer, Int32 index, Int32 count, AsyncCallback callback, Object state) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1146
   at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.TaskFromVoidApm[T1,T2,T3](Func`6 beginMethod, Action`1 endMethod, T1 arg1, T2 arg2, T3 arg3, CancellationToken cancellationToken) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\AsyncExtensions.cs:line 210
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromByteArrayAsync(Byte[] buffer, Int32 index, Int32 count, CancellationToken cancellationToken) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1204
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromByteArrayAsync(Byte[] buffer, Int32 index, Int32 count) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1190
...