为什么 POST 没有更改我的项目中的源代码?使用 Visual Studio 进行编辑,以及 ASP.NET Core Web API

问题描述 投票:0回答:1

为什么 POST 没有更改我的项目中的源代码?使用 Visual Studio 进行编辑,以及 ASP.NET Core Web API。

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace CountryAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AppController : ControllerBase
    {
        private List<string> weekDay = new List<string>()
        {
            "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
        };

        // GET: api/App
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return weekDay;
        }

        // POST api/App
        [HttpPost]
        public IActionResult Post([FromBody] string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return BadRequest("Value cannot be null or empty.");
            }

            weekDay.Add(value);
            return Ok(); // Return 200 OK if successful
        }
    }
}

预期使用 POST 修改列表,但 GET 未显示对列表的更改

asp.net-core-webapi
1个回答
0
投票

每次向控制器发出请求时,都会创建控制器的一个新实例。因此,weekDay 列表会针对每个请求使用其默认值重新初始化,并且 POST 请求期间所做的任何更改都不会在不同的请求中保留。

要跨请求持久更改,您可以通过多种方式实现。通过阅读您的代码逻辑,我建议您使用比控制器寿命更长的服务。您可以使用依赖注入来实现这一点,方法是注册一个服务,其范围在多个请求中持续存在(例如,单例或范围)。

1.创建接口

public interface IWeekDayService
{
    List<string> GetWeekDays();
    void AddWeekDay(string value);
}

2.实施服务

public class WeekDayService : IWeekDayService
{
    private List<string> weekDay = new List<string>()
    {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
    };

    public List<string> GetWeekDays()
    {
        return weekDay;
    }

    public void AddWeekDay(string value)
    {
        weekDay.Add(value);
    }
}

3.注入服务

public class AppController : ControllerBase
{
    private readonly IWeekDayService _weekDayService;

    public AppController (IWeekDayService weekDayService)
    {
        _weekDayService = weekDayService;
    }
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return _weekDayService.GetWeekDays();
    }

    // POST api/App
    [HttpPost]
    public IActionResult Post([FromBody] string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            return BadRequest("Value cannot be null or empty.");
        }

        _weekDayService.AddWeekDay(value);
        return Ok(); // Return 200 OK if successful
    }
}

4.注册服务

builder.Services.AddSingleton<IWeekDayService, WeekDayService>(); // Singleton service
© www.soinside.com 2019 - 2024. All rights reserved.