.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设计)
通过依赖注入注册一个单例服务来存储用户列表,更灵活且符合框架设计原则:
- 创建用户存储服务:
using rest_api_crud.Models; namespace rest_api_crud.Services { public class UserStore { public List<UsersModel> Users { get; } = new List<UsersModel>(); } }
- 在
Program.cs中注册单例服务:
builder.Services.AddSingleton<UserStore>();
- 修改控制器,通过构造函数注入服务:
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
相关产品推荐
相关产品推荐

