You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:51:00