Оптимистичный параллелизм для BLOB-объекта Azure Storage всегда выдает HTTP 412 - PullRequest
0 голосов
/ 01 октября 2018

Чтобы реализовать оптимистический параллелизм для большого двоичного объекта хранилища Azure, я создаю If-Match AccessCondition на основе значения ETag из свойств большого двоичного объекта.

Если другой процесс обновил BLOB-объект, служба BLOB-объектов должна вернуть сообщение о состоянии HTTP 412 (Precondition Failed).Однако служба всегда возвращает это состояние 412.

Для этого примера я посмотрел значение ETag вручную с помощью Storage Explorer.

Минимальный фрагмент для воспроизведения проблемы:

var storage = CloudStorageAccount.Parse(connectionString);

var blobClient = storage.CreateCloudBlobClient();

var container = blobClient.GetContainerReference("foo");

var blob = container.GetBlockBlobReference("foo/1");

await blob.UploadTextAsync(
          "test", 
           Encoding.UTF8,
           AccessCondition.GenerateIfMatchCondition("\"0x1A52537587A1234\""),
           new BlobRequestOptions(),
           null);

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Проблема заключалась в том, что я случайно использовал неправильный blobName:

var blob = container.GetBlockBlobReference("foo/1"); 

Это должно быть:

var blob = container.GetBlockBlobReference("1");

, иначе проверка ETag не будет выполнена правильно, поскольку неткапля с именем foo/1.

0 голосов
/ 02 октября 2018

Когда вы загружаете BLOB-объект с определенным значением ETAG, он будет работать впервые.Однако, когда вы повторно загружаете BLOB-объект с тем же ETAG, он выдаст ошибку 412.Поскольку при работе с большим двоичным объектом будет обновляться ETAG.

Оптимистичный параллелизм для больших двоичных объектов и контейнеров

Пользователь, выполняющий обновление такого объекта, может отправить висходный ETag вместе с условным заголовком, чтобы гарантировать, что обновление будет происходить только при соблюдении определенного условия - в этом случае это заголовок If-Match, который требует, чтобы служба хранения обеспечивала значение ETag в запросе на обновление указано то же, что указано в службе хранения.

// Retrieve Etag from the response of an earlier UploadText blob operation.
string orignalETag = blockBlob.Properties.ETag;
// This code simulates an update by a third party.
string helloText = "Blob updated by a third party.";
// No etag, provided so orignal blob is overwritten (thus generating a new etag)
blockBlob.UploadText(helloText);
Console.WriteLine("Blob updated. Updated ETag = {0}", blockBlob.Properties.ETag);
// Now try to update the blob using the orignal ETag provided when the blob was created
try
{
     Console.WriteLine("Trying to update blob using orignal etag to generate if-match access condition");
     blockBlob.UploadText(helloText,accessCondition:
     AccessCondition.GenerateIfMatchCondition(orignalETag));
}
catch (StorageException ex)
{
     if (ex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.PreconditionFailed)
     {
          Console.WriteLine("Precondition failure as expected. Blob's orignal etag no longer matches");
     }
}

Более подробно вы можете обратиться к этой статье .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...