我已将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."
在对此问题进行研究的同时,我发现了一个link,并写道
"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 Table存储时,它具有正确的值。
有人可以帮我吗?
非常感谢。
答案 0 :(得分:0)
此异常的原因(source):
如果实体的ETag与更新中指定的ETag不同 请求,更新操作失败,状态码为412(前提条件 失败)。此错误表明实体已在 服务器,因为它已被检索。要解决此错误,请检索 再次实体,然后重新发出请求。
一种方法,它允许进行任何更新操作,而无需验证自该应用程序首次读取数据以来是否有其他应用程序更新了数据。
足以满足您的情况,您只需在执行更新操作之前添加通配符 ETag 。 像这样:
myEntityToUpdate.ETag = "*";
否则,您必须自己处理不同步的内容-例如捕获异常,再次获取更新的数据(使用更新的 ETag ),并尝试更新更新的数据(使用更新的 ETag 。)您可以了解有关Microsoft Azure存储中的并发性的更多信息{ {3}}。