ASP.NET Core Web API中POST请求无法修改列表?Visual Studio开发疑问
问题原因
你的问题核心在于ASP.NET Core控制器的实例生命周期:框架默认会为每个请求创建全新的AppController实例。也就是说:
- 发送POST请求时,会生成一个控制器实例,向它的
weekDay列表添加元素,请求结束后这个实例就被销毁 - 发送GET请求时,又会创建一个全新的控制器实例,它的
weekDay是初始的默认列表,自然看不到之前添加的元素
解决方案
以下是几种可行的修复方案,按需选择:
1. 将列表改为静态成员
把weekDay声明为静态变量,让所有控制器实例共享同一个列表:
using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; namespace CountryAPI.Controllers { [Route("api/[controller]")] [ApiController] public class AppController : ControllerBase { // 改为静态列表,实现跨实例共享 private static List<string> weekDay = new List<string>() { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; [HttpGet] public IEnumerable<string> Get() { return weekDay; } [HttpPost] public IActionResult Post([FromBody] string value) { if (string.IsNullOrEmpty(value)) { return BadRequest("Value cannot be null or empty."); } weekDay.Add(value); return Ok(); } } }
注意:静态变量会在应用生命周期内持续存在,重启应用后数据会丢失;多线程并发场景下,建议用ConcurrentBag<string>替代List<string>保证线程安全。
2. 使用单例服务存储数据
这是更符合ASP.NET Core设计理念的方式,将数据逻辑抽离到单例服务中:
第一步:创建数据服务
using System.Collections.Concurrent; namespace CountryAPI.Services { public class WeekDayService { // 线程安全集合处理并发请求 public ConcurrentBag<string> WeekDays { get; } = new ConcurrentBag<string>() { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; } }
第二步:注册单例服务
在Program.cs中添加服务注册:
builder.Services.AddSingleton<WeekDayService>();
第三步:控制器中注入服务
using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using CountryAPI.Services; namespace CountryAPI.Controllers { [Route("api/[controller]")] [ApiController] public class AppController : ControllerBase { private readonly WeekDayService _weekDayService; // 构造函数注入单例服务 public AppController(WeekDayService weekDayService) { _weekDayService = weekDayService; } [HttpGet] public IEnumerable<string> Get() { return _weekDayService.WeekDays; } [HttpPost] public IActionResult Post([FromBody] string value) { if (string.IsNullOrEmpty(value)) { return BadRequest("Value cannot be null or empty."); } _weekDayService.WeekDays.Add(value); return Ok(); } } }
这种方式更易维护扩展,也能更好地应对并发场景。
3. 使用持久化存储(生产环境推荐)
如果需要数据在应用重启后不丢失,应该使用数据库(如SQLite、SQL Server)、Redis或文件存储等持久化方案,而非内存存储。
内容的提问来源于stack exchange,提问作者Prottasha D'cruze
相关产品推荐
相关产品推荐

