使用Azure表存储时,我应该预期哪些状态代码

使用Azure表存储时,我应该预期哪些状态代码,azure,azure-table-storage,Azure,Azure Table Storage,如果Azure表存储上的插入操作失败,我想做些什么。假设当我收到错误时,我想从下面的代码返回false\u table属于CloudTable类型,下面的代码有效 public bool InsertEntity(TableEntity entity) { var insertOperation = TableOperation.Insert(entity); var result = _table.Execute(insertOperation); return (re

如果Azure表存储上的插入操作失败,我想做些什么。假设当我收到错误时,我想从下面的代码返回
false
<代码>\u table属于
CloudTable
类型,下面的代码有效

public bool InsertEntity(TableEntity entity)
{
    var insertOperation = TableOperation.Insert(entity);
    var result = _table.Execute(insertOperation);
    return (result.HttpStatusCode == (int)System.Net.HttpStatusCode.OK);
}
当操作成功时,我得到结果203。但也有其他可能的结果,如“200 OK”

如何编写一段代码,使我能够从状态代码中了解出了什么问题?

由此:

Azure存储服务的REST API操作返回标准HTTP 状态代码,如中所定义

因此,针对表服务的每个成功操作都将返回2XX状态代码。要了解返回的确切代码,我建议检查页面上的每个操作。例如,如果操作成功,则操作返回201状态代码


同样,对于表服务中的错误,您将获得400范围内的错误代码(这意味着您提供了错误的数据,例如,如果您试图创建一个已经存在的表,则为409(冲突)错误)或500范围内的错误代码(例如,表服务不可用)。您可以在此处找到所有表服务错误代码的列表:。

基本上,2xx中的任何返回都是“OK”。在本例中:

203非权威信息:

指示返回的元信息来自缓存副本 而不是 源服务器,因此可能不正确

本白皮书进一步阐述了:

9.6.5错误处理和报告

RESTAPI被设计成与现有HTTP客户端交互的标准HTTP服务器 (例如,浏览器、HTTP客户端库、代理、缓存等)。 为了确保HTTP客户端正确处理错误,我们映射每个窗口 Azure表错误,返回HTTP状态代码

HTTP状态代码的表现力不如Windows Azure表错误 代码和包含的有关错误的信息较少。虽然HTTP 状态代码包含的错误信息较少,客户端 了解HTTP通常会正确处理错误

因此,在处理错误或报告Windows Azure表时 对于最终用户,请使用Windows Azure表错误代码以及 HTTP状态代码,因为它包含有关错误的更多信息。 此外,在调试应用程序时,还应咨询 XML错误的人类可读元素 答复

这些链接也很有用:


使用.NET SDK,任何需要处理的情况都会引发异常。i、 e.任何非2xx的状态代码都将导致异常

为了处理出错的情况,我不必为每个请求手动检查结果的状态代码。我所要做的就是编写异常处理代码。如下图所示:

        try
        {
            var result = _table.Execute(insertOperation);
        }
        catch (Exception)
        {
            Log("Something went wrong in table operation.");
        }

如果您正在使用Azure Storage SDK访问Azure表存储,SDK将在客户端为从表存储服务返回的意外Http状态代码引发StorageException。要提取实际的HttpStatusCode,需要将代码包装在try{}catch(StorageException ex){}块中。然后解析实际的异常对象以提取嵌入其中的HttpStatusCode

看看我在Nuget中实现的Azure存储异常解析器:

这将从Azure StorageExceptions中提取HttpStatusCode和许多其他有用的字段。您可以使用相同的库accross表、blob、队列客户端等,因为它们都遵循相同的StorageException模式

请注意,Azure Storage SDK将引发一些非StorageExceptions的异常,这些异常主要是客户端请求验证类型的异常,并且自然不包含任何HttpStatusCode。(因此,您需要捕获特定的StorageExceptions以提取HttpStatusCode)

另请注意,Azure Storage SDK对于失败的请求具有相当强健的重试机制。下面是SDK源代码中的代码片段,他们在其中决定是否可以检索失败的响应

if((状态码>=300&&statusCode<500&&statusCode!=408)
||statusCode==501//未实现
||statusCode==505//不支持版本
||lastException.Message==SR.BlobTypeMismatch)
{
return false;//aka.如果w在此处,请不要重试,否则在最大重试次数内重试。。
}

如果首先出现异常,您将如何在catch块中生成
result.HttpStatusCode
?@Emre Kenci-这不会计算。
        if ((statusCode >= 300 && statusCode < 500 && statusCode != 408)
              || statusCode == 501 // Not Implemented
                || statusCode == 505 // Version Not Supported
            || lastException.Message == SR.BlobTypeMismatch)
        {
            return false; //aka. do not Retry if w are here otherwise Retry if within max retry count..
        }