求助:C#调用Azure接口报RuntimeBinderException空引用运行时绑定错误
问题根因
RuntimeBinderException: Cannot perform runtime binding on a null reference错误的触发原因分为两类:
- 若错误确实触发在
GetAsync调用行:说明传入的RoleDefinitionID/SubscriptionID参数为null,构造请求URI时生成了非法路径,或AzToken为空导致请求头构造失败 - 绝大多数情况下错误触发在后续
RoleDefinitionNameResult.properties.roleName属性访问行:接口请求返回非200状态码,响应结构不符合预期,反序列化后RoleDefinitionNameResult或其下的properties属性为null,运行时动态绑定空对象属性抛出异常。
修复方案
- 增加入参非空校验
- 新增HTTP响应状态码校验,请求失败时先抛出明确异常方便排查
- 替换
dynamic动态绑定为JObject解析,增加空值判断 - 异步方法调用不要使用
.Result,改用await避免线程死锁
修复后代码
方法调用
// 调用处所在方法需标记为async string AccessLevel = await Helper.GetRoleDefinitionName(RoleDefinitionID, SubscriptionID, AzToken);
核心方法实现
using Newtonsoft.Json.Linq; // 需引入Newtonsoft.Json命名空间 public static async Task<string> GetRoleDefinitionName(string RoleDefinitionID, string SubscriptionID, string AzToken) { // 入参非空校验 if (string.IsNullOrWhiteSpace(RoleDefinitionID)) throw new ArgumentNullException(nameof(RoleDefinitionID)); if (string.IsNullOrWhiteSpace(SubscriptionID)) throw new ArgumentNullException(nameof(SubscriptionID)); if (string.IsNullOrWhiteSpace(AzToken)) throw new ArgumentNullException(nameof(AzToken)); var RoleDefinitionNamehttpClient = new HttpClient { BaseAddress = new Uri("https://management.azure.com/subscriptions/") }; string RoleDefinitionNameURI = $"{SubscriptionID}/providers/Microsoft.Authorization/roleDefinitions/{RoleDefinitionID}?api-version=2018-01-01-preview"; RoleDefinitionNamehttpClient.DefaultRequestHeaders.Remove("Authorization"); RoleDefinitionNamehttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + AzToken); HttpResponseMessage RoleDefinitionNameResponse = await RoleDefinitionNamehttpClient.GetAsync(RoleDefinitionNameURI).ConfigureAwait(false); // 校验请求是否成功 RoleDefinitionNameResponse.EnsureSuccessStatusCode(); var RoleDefinitionNameHttpsResponse = await RoleDefinitionNameResponse.Content.ReadAsStringAsync(); JObject RoleDefinitionNameResult = JObject.Parse(RoleDefinitionNameHttpsResponse); // 空值判断避免空引用 string RoleDefinitionName = RoleDefinitionNameResult["properties"]?["roleName"]?.ToString(); if (string.IsNullOrWhiteSpace(RoleDefinitionName)) throw new InvalidOperationException("无法从接口响应中获取角色定义名称,响应内容:" + RoleDefinitionNameHttpsResponse); return RoleDefinitionName; }
内容的提问来源于stack exchange,提问作者Vinny
相关产品推荐
相关产品推荐

