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

使用SAS执行Azure Table批量插入失败,账户密钥可正常运行

Azure Table Storage批量插入用SAS报415 Unsupported Media Type的解决办法

我来帮你解决这个问题——你遇到的415错误其实是两个常见问题导致的:客户端URI配置错误,加上SAS类型和请求媒体类型不匹配。下面一步步给你说怎么修复:

首先修正最关键的URI配置错误

你的代码里犯了一个容易忽略的错误:CloudTableClient的初始化URI不应该包含表名。你现在把表名加到了client的地址里,这会导致批量操作的请求路径混乱,服务器根本无法正确识别你的请求。

修正后的初始化代码应该是这样的:

// 只需要表服务的根地址,不带具体表名
CloudTableClient cloudTableClient = new CloudTableClient(new URI("https://<storage account>.table.core.windows.net/"), credentials);
// 然后通过getTableReference指定要操作的表
CloudTable cloudTable = cloudTableClient.getTableReference("<tablename>");

调整SAS参数或请求格式(如果还报错)

如果修正URI后还是出现415错误,那就是SAS类型和请求媒体类型不兼容的问题了:

  • 你当前用的是表级SAS(带tn=<table name>参数),而Azure Storage对表级SAS的请求有格式限制,只允许application/atom+xml格式,但旧版SDK的批量操作默认用application/json,这就导致了"不支持的媒体类型"错误。

你有两个解决选项:

  1. 改用服务级SAS:生成SAS的时候不要指定tn参数,权限保持sp=raud(已经包含批量插入需要的a权限)。服务级SAS针对整个表服务,支持JSON格式的批量请求。
  2. 强制SDK使用XML格式:如果必须用表级SAS,就在初始化client后添加一行配置,强制批量操作使用XML格式:
    cloudTableClient.getTableRequestOptions().setPayloadFormat(PayloadFormat.ATOM);
    

完整修复后的代码示例

StorageCredentialsSharedAccessSignature credentials = new StorageCredentialsSharedAccessSignature("sig=.....");
// 修正:使用表服务根URI
CloudTableClient cloudTableClient = new CloudTableClient(new URI("https://<storage account>.table.core.windows.net/"), credentials);
// 可选:如果用表级SAS,开启XML格式支持
// cloudTableClient.getTableRequestOptions().setPayloadFormat(PayloadFormat.ATOM);
CloudTable cloudTable = cloudTableClient.getTableReference("<tablename>");

// 构造实体
TableServiceEntity d1 = new TableServiceEntity("3333333333333", "22222222222222" + System.currentTimeMillis());
TableServiceEntity d2 = new TableServiceEntity("3333333333333", "eeeeeeeeeee" + System.currentTimeMillis());
TableServiceEntity d3 = new TableServiceEntity("ddddddddddddddddddd", "dddddddddd" + System.currentTimeMillis());

// 批量操作
TableBatchOperation batch = new TableBatchOperation();
batch.insert(d1);
batch.insert(d2);

try {
    cloudTable.execute(TableOperation.insert(d3));
    cloudTable.execute(batch);
    System.out.println("OK");
} catch (StorageException e) {
    e.printStackTrace();
    return;
}

为啥会出现这个错误?

简单说:

  1. URI配置错误导致请求路径重复了表名,服务器无法解析请求,返回415。
  2. 表级SAS限制了请求必须用XML格式,但SDK默认用JSON发批量请求,两者不匹配就触发了媒体类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:56:15