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

获取Azure资源成本消耗明细的API及ASP.NET MVC实现方案

接口调用失败核心原因

你之前使用的两个Consumption接口本身不匹配单资源成本明细的查询场景:

  • Budgets List接口仅用于查询指定作用域下配置的预算规则,不返回任何实际消费数据。如果对应作用域下从未创建过预算配置,即便范围、权限参数完全正确,也会返回404错误。
  • Charges List接口仅面向企业协议(EA)、微软客户协议(MCA)类计费账户返回聚合维度的费用数据,即用即付、CSP、MSDN等常见订阅类型调用该接口时,即使返回200状态码,也无法拿到资源级的有效明细,且该接口本身不支持单资源粒度的费用拆分。
可落地实现方案

优先使用官方SDK调用,比手写HTTP请求的鉴权、参数处理逻辑更稳定,能减少大部分格式、版本兼容问题。

前置准备

  • 在Azure AD中注册应用,为应用授予Consumption Usage Read应用权限,同时在需要查询的目标订阅/资源组/单资源范围上,为该应用对应的服务主体分配成本管理读者(Cost Management Reader)RBAC角色——成本数据的权限与普通资源读写权限独立,即便是资源所有者角色,默认也无法读取成本明细。
  • 在ASP.NET MVC项目中安装NuGet包Azure.ResourceManager.Consumption,该包为当前维护的正式版SDK,替代已停止更新的旧版Microsoft.Azure.Management.Consumption包。

核心调用代码

在MVC控制器中添加查询逻辑,获取明细后映射为自定义ViewModel传递到视图渲染即可:

using Azure.Identity;
using Azure.ResourceManager.Consumption;

// 初始化鉴权凭证
var tenantId = "你的Azure AD租户ID";
var clientId = "你注册的Azure AD应用客户端ID";
var clientSecret = "Azure AD应用配置的客户端密钥";
var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

// 替换为你要查询的目标范围ID:支持单资源、资源组、订阅、管理组四个维度
// 单资源ID格式示例:/subscriptions/{订阅ID}/resourceGroups/{资源组名}/providers/Microsoft.Compute/virtualMachines/{虚拟机名}
var targetScope = "你的查询范围ID";
var consumptionClient = new ConsumptionManagementClient(credential);

// 配置查询时间范围,示例为最近30天
var startDate = DateTime.UtcNow.AddDays(-30).ToString("yyyy-MM-dd");
var endDate = DateTime.UtcNow.ToString("yyyy-MM-dd");

// 拉取使用明细,展开计量信息字段获取单价、计费单位等数据
var usageResult = consumptionClient.UsageDetails.List(
    scope: targetScope,
    filter: $"properties/usageStart ge '{startDate}' and properties/usageEnd le '{endDate}'",
    expand: "properties/meterDetails"
);

// 遍历结果映射为业务模型
var costDetails = new List<CostItemViewModel>();
foreach (var detail in usageResult)
{
    costDetails.Add(new CostItemViewModel
    {
        ResourceName = detail.InstanceName,
        BillingItemName = detail.MeterDetails?.MeterName,
        Cost = detail.Cost ?? 0,
        UsageQuantity = detail.Quantity ?? 0,
        BillingDate = detail.UsageStart?.DateTime ?? DateTime.MinValue
    });
}
// 将costDetails传递到视图渲染即可

手写REST API调用方案

如果不想引入SDK依赖,可以直接调用Usage Details - ListREST接口,该接口支持所有Azure订阅合约类型,返回单资源粒度的成本明细:

  • 请求方法:GET
  • 请求路径格式:{targetScope}/providers/Microsoft.Consumption/usageDetails?api-version=2023-05-01&$filter=properties/usageStart ge '{startDate}' and properties/usageEnd le '{endDate}'&$expand=properties/meterDetails&$top=1000
  • 请求头携带Azure资源管理端点的有效Bearer Token即可发起请求,鉴权逻辑与SDK一致。
注意事项
  • 单次查询时间跨度不要超过1年,查询跨度超过90天或明细量较大时,务必处理接口返回的nextLink分页字段,不要尝试一次性拉取全量数据避免请求超时。
  • 刚生成的消费数据最长存在24小时的同步延迟,需要近实时预估成本、或者单批次查询明细超过10万条时,改用Cost Details异步导出接口,先生成成本报表文件再下载解析,稳定性更高。
  • 如果接口返回403错误,优先检查服务主体的RBAC角色是否正确配置,不要用普通资源读权限尝试访问成本接口。
  • 如果返回200但无数据,先确认查询时间范围内目标资源确实存在计费行为(停机不收费资源、免费额度覆盖的资源不会生成计费明细),同时确认使用的API版本与云环境匹配,2023-05-01版本在全球Azure、Azure中国区均可用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:42:15