ASP.NET Core API调用Graph API未找到用户仍返回200响应问题咨询
解决ASP.NET Core Web API调用Graph API返回用户不存在仍返回200的问题
问题原因分析
- Graph SDK默认行为:新版Microsoft Graph .NET SDK(v5+)默认不会对4xx/5xx状态码自动抛出
ApiException,而是返回包含错误信息的响应对象,导致你的try-catch块无法捕获异常。 - 返回null的问题:即使捕获到异常后返回null,ASP.NET Core控制器会将null视为成功响应,默认返回200 OK,而不是错误状态码。
解决方案
方案1:配置GraphClient自动抛出异常
在创建GraphServiceClient时,启用ThrowOnError选项,让SDK在收到4xx/5xx响应时自动抛出ApiException:
var graphClient = new GraphServiceClient(yourAuthProvider, options => { options.HttpProvider.ThrowOnError = true; });
之后修改控制器代码,捕获异常并返回明确的错误状态码:
try { var result = await graphClient.Users[guestUPN].GetAsync(); return Ok(result); } catch (ApiException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound) { return NotFound("指定的用户不存在"); } catch (ApiException ex) { return StatusCode((int)ex.StatusCode, ex.Message); }
方案2:手动检查响应状态(不依赖异常)
如果不想依赖自动抛出异常,可以请求完整响应并手动检查状态码:
var response = await graphClient.Users[guestUPN] .GetAsync(requestConfig => { requestConfig.ResponsePreference = ResponsePreference.ReturnFullResponse; }); if (response.HttpStatusCode == System.Net.HttpStatusCode.NotFound) { return NotFound("指定的用户不存在"); } // 解析响应内容 var user = await response.Content.ReadFromJsonAsync<User>(); return Ok(user);
关键注意点
- 永远不要直接返回
null作为控制器结果,ASP.NET Core会将其映射为200 OK。需要使用NotFound()、BadRequest()等方法返回对应的HTTP错误状态码。 - 确保Graph API的权限配置正确,避免因权限不足导致的其他错误响应。
内容的提问来源于stack exchange,提问作者Luís Costa
相关产品推荐
相关产品推荐

