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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:50:12