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

.NET Core Web API:为何List仅插入一个对象且Get请求返回空数组

问题原因与解决方案

问题根源

你的UsersController是ASP.NET Core默认的瞬时生命周期组件,每次接口请求都会创建一个全新的控制器实例:

  • 调用Post接口时,会初始化一个空的List<UsersModel>,添加一个用户后返回,请求结束后这个列表就会被销毁
  • 调用Get接口时,又是一个新的控制器实例,内部的users列表是空的,所以返回空数组

解决方案

方案1:使用静态字段(仅适合本地测试)

把users字段改为静态,让所有控制器实例共享同一个列表:

using Microsoft.AspNetCore.Mvc;
using rest_api_crud.Models;

namespace rest_api_crud.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class UsersController : ControllerBase
    {
         private static List<UsersModel> _users = new List<UsersModel>();// 静态字段,全局共享

        [HttpPost(Name = "PostUser")]
        public List<UsersModel> Post()
        {
            _users.Add(new UsersModel() { Name = "test", Age = 19 });
            return _users;
        }

        [HttpGet(Name = "GetUsers")]
        public List<UsersModel> Get()
        {   
            return _users;
        }
    }
}

注意:这种方式应用重启后数据会丢失,且多并发请求时存在线程安全问题,禁止在生产环境使用。

方案2:依赖注入单例服务(符合ASP.NET Core设计)

通过依赖注入注册一个单例服务来存储用户列表,更灵活且符合框架设计原则:

  1. 创建用户存储服务:
using rest_api_crud.Models;

namespace rest_api_crud.Services
{
    public class UserStore
    {
        public List<UsersModel> Users { get; } = new List<UsersModel>();
    }
}
  1. 在Program.cs中注册单例服务:
builder.Services.AddSingleton<UserStore>();
  1. 修改控制器,通过构造函数注入服务:
using Microsoft.AspNetCore.Mvc;
using rest_api_crud.Models;
using rest_api_crud.Services;

namespace rest_api_crud.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class UsersController : ControllerBase
    {
         private readonly UserStore _userStore;

        public UsersController(UserStore userStore)
        {
            _userStore = userStore;
        }

        [HttpPost(Name = "PostUser")]
        public List<UsersModel> Post()
        {
            _userStore.Users.Add(new UsersModel() { Name = "test", Age = 19 });
            return _userStore.Users;
        }

        [HttpGet(Name = "GetUsers")]
        public List<UsersModel> Get()
        {   
            return _userStore.Users;
        }
    }
}

方案3:生产环境持久化(推荐)

如果是生产环境,需要用数据库(如SQL Server、SQLite、MySQL等)来持久化用户数据,避免应用重启丢失数据,同时保证并发安全。


内容的提问来源于stack exchange,提问作者Illud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:17:15