使用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,这就导致了"不支持的媒体类型"错误。
你有两个解决选项:
- 改用服务级SAS:生成SAS的时候不要指定
tn参数,权限保持sp=raud(已经包含批量插入需要的a权限)。服务级SAS针对整个表服务,支持JSON格式的批量请求。 - 强制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; }
为啥会出现这个错误?
简单说:
- URI配置错误导致请求路径重复了表名,服务器无法解析请求,返回415。
- 表级SAS限制了请求必须用XML格式,但SDK默认用JSON发批量请求,两者不匹配就触发了媒体类型错误。
内容的提问来源于stack exchange,提问作者Maayan Hope
相关产品推荐
相关产品推荐

