Хранилище таблиц Azure (412) Не выполнено предварительное условие - PullRequest
1 голос
/ 22 марта 2019

Я использовал решение GitHub для URLshortener и развернул его на своем клиенте Azure.Теперь внезапно я получаю сообщение об ошибке

"Exception while executing function: Functions.UrlIngest. 
Microsoft.Azure.WebJobs.Host: Error while handling parameter keyTable after 
function returned:. Microsoft.WindowsAzure.Storage: The remote server 
returned an error: (412) Precondition Failed."

Во время исследования этой проблемы я нашел одну ссылку и написано, что

"If the entity's ETag differs from that specified with the update request,
the update operation fails with status code 412 (Precondition Failed). This 
error indicates that the entity has been changed on the server since it was 
retrieved. To resolve this error, retrieve the entity again and reissue the request."

Следовательно, чтобыЧтобы устранить эту проблему, я внес следующие изменения в код функции Azure

try
{
    await tableOut.ExecuteAsync(operation);
}
catch (StorageException ex)
{
    if (ex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.PreconditionFailed)
    {
        log.Info("Precondition failure as expected.");

        TableOperation retrieveOperation = TableOperation.Retrieve<NextId>(keyTable.PartitionKey, keyTable.RowKey);

        // Execute the operation.
        TableResult retrievedResult = tableOut.Execute(retrieveOperation);

        int idCount = keyTable.Id;

        // Assign the result to a CustomerEntity object.
        keyTable = (NextId)retrievedResult.Result;

        if (keyTable != null)
        {
            // Change the phone number.
            keyTable.Id = idCount;

            // Create the Replace TableOperation.
            TableOperation updateOperation = TableOperation.Replace(keyTable);

            // Execute the operation.
            tableOut.Execute(updateOperation);

            log.Info("Entity updated.");
        }
        else
        {
            log.Info("Entity could not be retrieved.");
        }
    }
}

И он по-прежнему выдает ту же ошибку, однако при проверке хранилища таблицы Azure у него правильные значения.

Может кто-нибудь помочь мне с этим?

Спасибо заранее.

1 Ответ

1 голос
/ 05 мая 2019

Причина этого исключения ( источник ):

Если ETag объекта отличается от указанного в обновлении запрос, операция обновления завершается с кодом состояния 412 (предварительное условие Не удалось). Эта ошибка указывает, что объект был изменен на сервер с момента его получения. Чтобы устранить эту ошибку, получите сущность снова и повторите запрос.

Если Последний писатель выигрывает подход

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

достаточно для вашего сценария, вам просто нужно добавить подстановочный знак ETag перед операцией обновления. Что-то вроде:

myEntityToUpdate.ETag = "*";

В противном случае вам придется самостоятельно работать с несинхронизированным контентом - например, поймать исключение, снова получить обновленные данные (с обновленными ETag ) и попытаться обновить более новые данные (с более новыми ETag .). Вы можете узнать больше о параллелизме в Microsoft Azure Storage здесь .

...