ASP.NET Core MVC调用API时httpResponse.IsSuccessStatusCode返回false是什么原因?
ASP.NET Core三层架构API调用异常修复方案
核心问题定位
- HttpClient使用方式错误:类级别HttpClient实例被using包裹,第一次调用后就被销毁,后续调用时实例已释放,同时未将配置的baseUrl赋值给HttpClient的BaseAddress属性,导致请求地址异常
- 业务层查询逻辑错误:循环覆盖查询结果,仅能返回最后一个符合条件的工单
- 潜在的授权和跨域配置问题
具体修复步骤
1. 修复HttpClient使用逻辑
推荐使用ASP.NET Core官方提供的IHttpClientFactory管理HttpClient生命周期,避免端口耗尽和实例释放问题:
首先在MVC项目的服务注册入口(Program.cs/Startup.cs)添加服务注册:
// .NET 6+ Program.cs 写法 builder.Services.AddHttpClient("BuildingAPIClient", client => { // 直接配置基础地址,无需单独声明静态变量 client.BaseAddress = new Uri("http://localhost:16982/api/BuildingManagerAPI/"); });
修改MVC控制器代码,通过注入获取HttpClient实例:
public class YourController : Controller { private readonly IHttpClientFactory _httpClientFactory; // 构造函数注入IHttpClientFactory public YourController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } [HttpGet] public async Task<ActionResult> GetTickets() { List<Ticket> TicketList = new List<Ticket>(); // 从工厂获取预配置的HttpClient实例 var client = _httpClientFactory.CreateClient("BuildingAPIClient"); var accessToken = HttpContext.Session.GetString("Token"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); // 直接传入接口名称即可,无需拼接基础地址 var httpResponse = await client.GetAsync("ViewTickets"); if (httpResponse.IsSuccessStatusCode) { TicketList = await httpResponse.Content.ReadAsAsync<List<Ticket>>(); } else { // 调试时可打印错误信息定位问题 var errorContent = await httpResponse.Content.ReadAsStringAsync(); // 可在此处添加日志逻辑记录错误 } return Json(TicketList, System.Web.Mvc.JsonRequestBehavior.AllowGet); } }
2. 修复业务层查询逻辑
原代码中foreach循环每次覆盖tickets变量,仅能返回最后一个符合条件的工单,修改为批量查询:
public List<Ticket> ViewTickets() { try { using (var db = new MaintenanceSysContext(_options)) { List<int> ticketsId = db.Tickets .SelectMany(t => t.backOfficesTickets) .Where(u => u.BackOfficeId == _backOfficeEntry.GetUserId()) .Select(t => t.TicketId) .ToList(); // 批量查询所有符合ID的工单 var tickets = db.Tickets.Where(t => ticketsId.Contains(t.Id)).ToList(); return tickets; } } catch (Exception) { throw; } }
3. 排查其他潜在问题
如果修复后仍返回非成功状态码,按以下顺序排查:
- 对比MVC侧Session存储的Token和Postman使用的Token是否一致,确认Token未过期、权限正常
- 检查API项目的CORS配置,确保允许MVC站点的域名/端口访问
- 确认API服务启动后端口为
16982,无端口冲突
内容的提问来源于stack exchange,提问作者nawar
相关产品推荐
相关产品推荐

