如何使用C#获取不同规格Azure VM的成本数据
C#查询Azure VM规格对应成本实现方案
实现思路
Azure公开了无身份验证的零售价格查询接口,可直接通过接口筛选获取所有VM规格的定价数据,和Azure门户展示价格完全对齐。
核心代码示例
using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; public class AzureVmPriceQuery { private static readonly HttpClient _client = new HttpClient(); /// <summary> /// 获取指定区域指定VM规格的月度预估价格 /// </summary> /// <param name="vmSku">VM规格,例如B2s、D2s_v5</param> /// <param name="region">Azure区域标识,例如eastus、chinaeast2</param> /// <param name="osType">操作系统类型,传入Windows或Linux</param> public async Task<decimal> GetVmMonthlyPriceAsync(string vmSku, string region = "eastus", string osType = "Windows") { // 构造查询筛选条件 string filter = $"serviceName eq 'Virtual Machines' and armRegionName eq '{region}' and skuName eq '{vmSku}' and type eq 'Consumption' and productName eq 'Virtual Machines B Series {osType}'"; string queryUrl = $"https://prices.azure.com/api/retail/prices?$filter={filter}"; var response = await _client.GetAsync(queryUrl); response.EnsureSuccessStatusCode(); string resultJson = await response.Content.ReadAsStringAsync(); using JsonDocument doc = JsonDocument.Parse(resultJson); // 取返回列表第一条的每小时单价,乘以730小时得到月度预估价格 decimal hourlyPrice = doc.RootElement.GetProperty("Items")[0].GetProperty("unitPrice").GetDecimal(); return Math.Round(hourlyPrice * 730, 2); } }
调用示例
你查询B2s规格的价格时,直接调用方法即可:
var query = new AzureVmPriceQuery(); // 得到的返回值即为$40.30,和门户展示的价格一致 decimal b2sPrice = await query.GetVmMonthlyPriceAsync("B2s");
注意事项
- 查询非B系列的VM规格时,需要修改筛选条件中
productName对应的系列名称,比如D系列v5改为Virtual Machines Dsv5 Series {osType}即可。 - 需要查询预留实例定价时,将筛选条件中的
type eq 'Consumption'替换为type eq 'Reservation',再补充对应预留时长的筛选参数即可。 - 中国区Azure的定价需要使用中国区专属的价格查询接口,筛选逻辑保持一致即可。
内容的提问来源于stack exchange,提问作者user3192935
相关产品推荐
相关产品推荐

