Microsoft Graph SDK报仅支持HTTP/1.0/1.1版本请求异常
异常触发原因
- 异常发生在客户端本地的请求参数校验阶段,早于实际网络发包环节,因此Fiddler无法捕获到HTTP/2.0的出站请求,请求并未真正发送到网络层。
- 核心触发逻辑:.NET 5及以上版本中,
HttpClient的DefaultRequestVersion属性默认值为HttpVersion.Version20,而当前使用的Microsoft Graph SDK、Azure.Identity依赖的Azure.Core版本内置了请求版本校验逻辑,仅允许HTTP/1.0、HTTP/1.1版本的请求,检测到版本为2.0时会直接抛出ArgumentException。 - 额外配置遗漏:仅将自定义HttpClientTransport配置给了用于获取身份令牌的
TokenCredentialOptions,但初始化GraphServiceClient时没有指定自定义HTTP提供器,SDK内部会自行创建默认HttpClient实例,该实例同样默认使用HTTP/2.0版本,也会触发校验异常。
修复方案
可选择以下任意一种方案解决问题:
- 方案一:显式配置所有用到的HttpClient强制使用HTTP/1.1版本,同时将配置好的客户端复用给认证流程和Graph请求流程,避免多实例配置不一致,修改后的代码如下:
private async Task<UserAccount> FetchAzurePropsFromGraph() { var scopes = new[] { "User.Read" }; var clientId = EWSMailboxSyncProvider.CLIENT_ID; var tenantId = ServicesConfiguration.GetStoredTenantID(); // 初始化HttpClient并显式指定默认请求版本为HTTP/1.1 System.Net.Http.HttpClient client = new System.Net.Http.HttpClient { DefaultRequestVersion = Version.Parse("1.1") }; var transport = new Azure.Core.Pipeline.HttpClientTransport(client); var options = new TokenCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud, Transport = transport }; var userNamePasswordCredential = new UsernamePasswordCredential( _o365UserName, _o365Password, tenantId, clientId, options); // 为Graph客户端指定使用已配置好的HttpClient实例,避免内部默认客户端触发版本校验错误 var httpProvider = new Microsoft.Graph.HttpProvider( new HttpClientHandler(), new Serializer(), client); var graphClient = new Microsoft.Graph.GraphServiceClient( new BaseClient("https://graph.microsoft.com/v1.0", userNamePasswordCredential, httpProvider), scopes); var user = await graphClient.Users[_emailAddress].Request().GetAsync(); var result = new UserAccount(); if (user != null) { result.DisplayName = user.DisplayName; result.City = user.City; result.Company = user.CompanyName; result.DisabledAccount = !(user.AccountEnabled ?? true); result.DistinguishedName = user.OnPremisesDistinguishedName; result.DomainName = user.OnPremisesDomainName; result.EmailAddresses.Add(user.Mail); foreach (var mail in user.OtherMails) { result.EmailAddresses.Add(mail); } } return result; }
- 方案二:将项目中引用的
Microsoft.Graph、Azure.Identity、Azure.Core包升级到最新稳定版本,新版本已移除HTTP/2.0的版本限制,支持直接使用默认HTTP/2配置发起请求,无需额外修改版本参数。
内容的提问来源于stack exchange,提问作者Shani Natav
相关产品推荐
相关产品推荐

