使用Graph API v4.50.0发邮件时遭遇HTTP/2 PROTOCOL_ERROR(0x1)求助
Graph API 4.50.0发送邮件触发HTTP/2 PROTOCOL_ERROR(0x1)问题排查
问题场景
使用Graph API(版本4.50.0)发送邮件时,突然抛出内部异常:
HttpProtocolException: The HTTP/2 server reset the stream. HTTP/2 error code 'PROTOCOL_ERROR' (0x1)
相关业务代码:
public async Task<bool> SendGraphEmailAsync(Message email) { var user = await _userProfileServ.GetCurrentUserAsync(); var authRecords = await _externalAuthServ.GetUserExternalAuthenticationRecordsAsync(user); var azureAuth = authRecords.FirstOrDefault(); if (azureAuth == null) return false; try { _graphClient.AuthenticationProvider = new DelegateAuthenticationProvider(async (requestMessage) => { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", azureAuth.OAuthAccessToken); }); //var outcome = await _graphClient.DeviceManagement..OnPremisesConnections["1234567890"].RunHealthChecks.PostAsync(); await _graphClient.Me.SendMail(email).Request().PostAsync();// 触发异常的代码行 return true; } catch { // 错误日志记录 } return false; }
异常截图:
异常详情截图
注:_graphClient为继承自Graph API包BaseClient的GraphServiceClient实例。
排查与解决方法
强制切换至HTTP/1.1协议
HTTP/2协议兼容性问题是这类报错的常见诱因,可通过配置HttpClient强制使用HTTP/1.1:// 初始化HttpClient时禁用HTTP/2 var httpClientHandler = new HttpClientHandler { UseHttp2 = false, SslProtocols = System.Security.Authentication.SslProtocols.Tls12 }; var httpClient = new HttpClient(httpClientHandler); // 建议在GraphServiceClient初始化时传入认证提供者,避免每次请求重复设置 var authProvider = new DelegateAuthenticationProvider(async (requestMessage) => { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", azureAuth.OAuthAccessToken); }); var _graphClient = new GraphServiceClient(httpClient, authProvider);验证OAuth Token有效性与权限
过期或权限不足的Token可能间接导致服务器重置连接:- 解码Token(如通过jwt.io)检查
exp字段确认是否过期 - 确认应用已获取
Mail.Send权限(委托权限需用户授权,应用权限需管理员同意)
- 解码Token(如通过jwt.io)检查
升级Graph API SDK版本
4.50.0版本可能存在HTTP/2相关已知问题,建议升级至最新稳定版(如v5.x系列)。注意v5.x与v4.x存在API差异,升级时需调整请求构建逻辑。检查邮件内容格式合法性
确认Message对象字段符合Graph API规范:- 避免收件人、主题、正文包含非法特殊字符
- 若带附件,检查单附件大小是否超过150MB的限制
完善异常捕获日志
当前catch块未记录详细异常信息,建议修改为捕获完整异常堆栈,辅助定位问题:catch (Exception ex) { Console.WriteLine($"异常类型:{ex.GetType().FullName}"); Console.WriteLine($"错误消息:{ex.Message}"); Console.WriteLine($"堆栈跟踪:{ex.StackTrace}"); if (ex.InnerException != null) { Console.WriteLine($"内部异常:{ex.InnerException.Message}"); Console.WriteLine($"内部堆栈:{ex.InnerException.StackTrace}"); } // 日志持久化逻辑 return false; }
内容的提问来源于stack exchange,提问作者YongaJ
相关产品推荐
相关产品推荐

