You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至Azure.Data.Tables后出现Azure表存储资源找不到404错误

Azure.Data.Tables迁移后查询表实体出现404错误排查

问题描述

从已弃用的Microsoft.Azure.Cosmos.Table库迁移至Azure.Data.Tables后,查询表实体时返回404资源不存在错误,错误详情如下:

{
"The specified resource does not exist.
RequestId:8612b003-0002-0071-64b2-054424000000
Time:2022-12-01T18:27:02.5504487ZrnStatus: 404 (Not Found)
ErrorCode: ResourceNotFound
Content:
{
    "odata.error":
    {
    "code":"ResourceNotFound",
        "message":
        {
            "lang":"en-US",
            "value":"The specified resource does not exist.
            RequestId:8612b003-0002-0071-64b2-054424000000
            Time:2022-12-01T18:27:02.5504487Z"
        }
    }
}
rnrnHeaders:rnCache-Control: no-cacher
Transfer-Encoding: chunked
Server: Windows-Azure-Table/1.0,
Microsoft-HTTPAPI/2.0
x-ms-request-id: 8612b003-0002-0071-64b2-054424000000
x-ms-client-request-id: c1668171-b91f-4eba-b2d1-1fef1120595a
x-ms-version: REDACTED
X-Content-Type-Options: REDACTED
Date: Thu, 01 Dec 2022 18:27:02 GMT
Content-Type: application/json; 
odata=minimalmetadata; 
streaming=true; 
charset=utf-8rn"
}

已确认表存在、认证正常、TableClient的URL与Azure后台一致,使用包含账户和密钥的连接字符串。

新旧代码对比

旧的可用代码(Microsoft.Azure.Cosmos.Table)

var primaryCloudStorageAccount = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("EntityRegistryStorageAccountConnectionString"));
var tableClient = primaryCloudStorageAccount.CreateCloudTableClient();
_registry = tableClient.GetTableReference("EntityRegistry");

新库下尝试的代码(Azure.Data.Tables)

方式一:直接实例化TableClient

private readonly TableClient _registry;
_registry = new TableClient(Environment.GetEnvironmentVariable("EntityRegistryStorageAccountConnectionString"), "EntityRegistry");

方式二:通过TableServiceClient获取TableClient

var tableClient = new TableServiceClient(Environment.GetEnvironmentVariable("EntityRegistryStorageAccountConnectionString"));
_registry = tableClient.GetTableClient("EntityRegistry");

触发错误的代码

调用以下方法均返回404:

var registryRecord = await _registry.GetEntityAsync<TableEntity>(entityType.ToString(), registryId);
var registryRecord = await _registry.GetEntityIfExistsAsync<TableEntity>(entityType.ToString(), registryId);

可能的原因及解决方案

1. 分区键/行键大小写不匹配

Azure.Data.Tables对分区键和行键的大小写严格区分,而旧库在部分场景下会自动兼容大小写差异。

  • 检查entityType.ToString()生成的分区键、registryId行键与表中实际存储的实体键值大小写是否完全一致。
  • 可先调用QueryAsync查询全表实体,确认目标实体的键值准确格式。

2. 连接字符串端点类型错误

若原连接字符串指向Cosmos DB表API端点(格式为https://<account>.documents.azure.com),而Azure.Data.Tables默认适配存储账户表服务端点(https://<account>.table.core.windows.net),会导致请求路径错误。

  • 确认连接字符串的端点类型:如果是存储账户,使用标准格式DefaultEndpointsProtocol=https;AccountName=<account>;AccountKey=<key>;EndpointSuffix=core.windows.net;如果是Cosmos DB表API,需在实例化TableClient时指定TableClientOptions,并确保连接字符串正确指向Cosmos DB端点。

3. 表名称大小写问题

虽然Azure存储表本身不区分大小写,但Azure.Data.Tables构造请求时会严格使用传入的表名称大小写,若新旧代码中表名称大小写不一致,可能导致请求路径不匹配。

  • 确认新代码中传入的"EntityRegistry"与Azure后台表名称的大小写完全一致。

4. 实体类型映射异常

直接使用TableEntity作为泛型参数时,若旧代码中使用自定义实体类,可能存在属性映射不匹配的情况,间接表现为找不到实体。

  • 尝试自定义实体类并实现ITableEntity接口,明确映射分区键、行键及其他属性,再传入GetEntityAsync方法测试。

5. 连接字符串含干扰参数

旧连接字符串可能包含TableEndpoint等自定义参数,Azure.Data.Tables解析时可能出现异常。

  • 清理连接字符串中的额外自定义参数,使用标准格式的连接字符串。

内容的提问来源于stack exchange,提问作者user1299379

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:30:43