ASP.NET Core MVC(.NET 5)控制器调用API后无法返回JSON结果问题
问题排查与解决方案
以下是导致代码无法执行到return语句的常见原因及对应修复方案:
- 未捕获API调用或反序列化过程的异常
现有代码未做响应状态校验和异常捕获,API调用失败(如本地44379端口API未启动、证书校验不通过、路由不匹配、跨域限制)或JSON反序列化不匹配都会直接抛出异常终止方法执行,无法走到返回逻辑。可先补充异常捕获逻辑定位问题:[Produces("application/json")] public class PodcastController : Controller { #region "Async call API" public async Task<JsonResult> GetPodcastLandingPortada() { List<PPodcast> ppodcastPortada = new List<PPodcast>(); // 调试阶段临时补充异常捕获,正式环境建议用日志框架记录 try { using (var httpClient = new HttpClient()) { using (var response = await httpClient.GetAsync("https://localhost:44379/api/Podcast/ObtenerPodcastPortadaPrincipal")) { // 先校验API响应是否为成功状态 response.EnsureSuccessStatusCode(); string apiResponse = await response.Content.ReadAsStringAsync(); ppodcastPortada = JsonConvert.DeserializeObject<List<PPodcast>>(apiResponse); } } } catch (Exception ex) { // 调试时可直接返回异常信息快速定位问题 return Json(new { error = ex.Message, stackTrace = ex.StackTrace }); } return Json(ppodcastPortada); } #endregion } - 异步调用配置问题导致死锁
建议给所有await调用补充ConfigureAwait(false),减少上下文切换开销,避免特殊场景下的异步死锁:using (var response = await httpClient.GetAsync("请求地址").ConfigureAwait(false)) { string apiResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false); } - 长期优化建议
不要每次请求都实例化HttpClient,该操作会导致套接字资源耗尽、连接复用效率低,建议改用ASP.NET Core内置的IHttpClientFactory注入获取HttpClient实例。 - 额外排查点
确认控制器方法是否添加了[HttpGet]注解,前端调用的路由与控制器路由配置是否匹配,是否有授权、拦截器逻辑导致方法根本未被触发执行。
内容的提问来源于stack exchange,提问作者Daniel Lazarte
相关产品推荐
相关产品推荐

