删除azure表存储行而不检查是否存在

时间:2015-08-31 21:39:41

标签: c# azure azure-table-storage

我多年来一直在使用azure table storage,而且我不确定"是什么"这样做的方法是使用最新的WindowsAzure.Storage库,版本5.0.1-preview(用于新的ASP.NET 5应用程序):

问题: 给定分区键和行键,删除行而不先检查是否存在,如果不存在则不会失败。

当前解决方案:此代码有效......但异常处理令人困惑:

public async Task DeleteRowAsync(CloudTable table, string partition, string row)
{
    var entity = new DynamicTableEntity(partition, row);
    entity.ETag = "*";

    var op = TableOperation.Delete(entity);
    try
    {
        await table.ExecuteAsync(op);
    }
    catch (Exception ex)
    {
        var result = RequestResult.TranslateFromExceptionMessage(ex.Message);
        if (result == null || result.HttpStatusCode != 404)
            throw ex;
    }
}

问题:

  1. 异常本身向我指出了这个TranslateFromExceptionMessage方法......我无法找到关于它的大量信息和WrappedStorageException(抛出的异常的类型)。这是检查存储异常404错误的某种新的/首选方法吗?有没有人知道现在所有的存储异常都会使用它,还是我需要编写代码来测试并找出它?

  2. 存在StorageException类型的InnerException。据推测,我们使用StorageException.RequestInformation.HttpStatusCode的旧代码可以以相同的方式访问此内部异常。那是"好的",还是以某种方式解析这些新的XML错误消息更好或更强大?

  3. 对于这种情况,我应该考虑采用不同的方法吗?

2 个答案:

答案 0 :(得分:0)

当配置为使用Azure表存储时,在AspNet WebHooks项目中可以找到类似的方法。看看 signup() { this.performingRequest = true fb.auth.createUserWithEmailAndPassword(this.signupForm.email, this.signupForm.password).then(user => { this.$store.commit('setCurrentUser', user) // create user obj fb.usersCollection.doc(user.uid).set({ name: this.signupForm.name, email: this.signupForm.email }).then(() => { this.$store.dispatch('fetchUserProfile') this.performingRequest = false this.$router.push('/world') }).catch(err => { console.log(err) this.performingRequest = false this.errorMsg = err.message }) }).catch(err => { console.log(err) this.performingRequest = false this.errorMsg = err.message }) }, StorageManager类。

我不确定这是否会在您已经发现的内容的基础上增加很多,但是他们会处理所有事情而不会引发异常,并且始终返回状态代码,以便您可以根据需要做出反应。

这里的区别是它们将Microsoft.Aspnet.WebHooks.custom.AzureStoragetable传递给多功能ExecuteAsync方法,而不是专门用于删除,但这只是实现细节。

示例中的相关代码:

operation

答案 1 :(得分:0)

RequestResult.TranslateFromExceptionMessage 方法现在标记为 [Obsolete],我想要一种自己忽略 404 的方法。

根据您查看 RequestInformation.HttpStatusCode 的提示,我得出以下结论:

try
{
    await table.ExecuteAsync(op);
}
catch (StorageException storEx)
{
    if (storEx.RequestInformation.HttpStatusCode != 404)
    {
        throw;
    }
}