首页 > 解决方案 > .Net Core 不路由到 POST 方法,但 GET 方法有效

问题描述

我正在使用示例 Web 应用程序进行培训。由于未知原因,.Net Core 不会将 POST 请求路由到相应的方法。获取方法正在工作,但 POST 甚至没有被解雇。POST 请求返回 404。

我已经尝试添加这样的注释,但没有帮助。

有人可以请

[HttpPost("envelope")]

这是我的控制器的代码。

namespace Receiver.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class EnvelopesController : ControllerBase
    {
        private readonly ReceiverDbContext _dbContext;
        private readonly ILogger _logger;

        public EnvelopesController(ReceiverDbContext dbContext, ILogger logger)
        {
            _dbContext = dbContext;
            _logger = logger;
        }



        /// <summary>
        /// GET (Read all) /envelopes
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ProducesResponseType(StatusCodes.Status200OK)]
        public async Task<ActionResult<IEnumerator<EnvelopeDTO>>> GetAll()
        {

            _logger.LogInformation("Hello from the Get() method!");

            var envelopes = await _dbContext.Envelope.Include(e => e.Type).ToArrayAsync();
            return Ok(envelopes.Select(e => e.ToDTO()));

            
        }

        /// <summary>
        /// GET (Read) /envelope/{id}
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("{id}")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public async Task<ActionResult<EnvelopeDTO>> Get(int id)
        {
            var envelope = await _dbContext.Envelope.Include(e => e.Type).FirstOrDefaultAsync(s => s.Id == id);

            if (envelope == null)
                return NotFound();

            return Ok(envelope.ToDTO());
        }

        /// <summary>
        /// POST (Create) /envelope
        /// </summary>
        /// <param name="envelopeDto"></param>
        /// <returns></returns>
        [HttpPost("envelope")]
        [ProducesResponseType(StatusCodes.Status201Created)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status409Conflict)]
        public async Task<ActionResult<EnvelopeDTO>> Create([FromBody] EnvelopeDTO envelopeDto)
        {
            _logger.LogInformation("Hello from the Post() method!");

            if (string.IsNullOrEmpty(envelopeDto.СontentX))
                return BadRequest();

            var @type = await _dbContext.EnvelopeType.FirstOrDefaultAsync(t => t.Id == envelopeDto.TypeId);
            if (@type == null)
                return NotFound();

            var @user = await _dbContext.User.FirstOrDefaultAsync(u => u.UserName == envelopeDto.User);
            if (@user == null)
                return NotFound();

            var existingEnvelope = await _dbContext.Envelope.FindAsync(envelopeDto.СontentX);
            if (existingEnvelope != null)
                return Conflict();

            var envelopeToAdd = envelopeDto.ToModel(@type, @user);
            _dbContext.Envelope.Add(envelopeToAdd);
            await _dbContext.SaveChangesAsync();
            var updatedEnvelopeDto = envelopeToAdd.ToDTO();

            return CreatedAtAction(nameof(Get), new { Content = envelopeDto.СontentX }, updatedEnvelopeDto);
            
        }

        /// <summary>
        /// DELETE /envelope/{id}
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("{id}")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public async Task<ActionResult<EnvelopeDTO>> Delete(int id)
        {
            var envelope = await _dbContext.Envelope.FindAsync(id);
            if (envelope == null)
                return NotFound();

            _dbContext.Envelope.Remove(envelope);
            await _dbContext.SaveChangesAsync();
            return Ok(envelope.ToDTO());
        }
                
    }
    public static class EnvelopeExtensions
    {
        public static Envelope ToModel(this EnvelopeDTO envelopeDto, EnvelopeType @type, User @user)
        {
            //if (@class.Id != studentDto.ClassId) throw new NotSupportedException();
            return new Envelope
            {
                //DateTimeReceivied = DateTime.Now,
                Type = @type,
                СontentX = envelopeDto.СontentX,
                User = @user
            };
        }
        public static EnvelopeDTO ToDTO(this Envelope envelope)
        {
            return new EnvelopeDTO
            {
                //DateTimeReceivied = DateTime.Now,
                TypeId = envelope.Type.Id,
                СontentX = envelope.СontentX,
                User = envelope.User.UserName
            };
        }
    }
}

以下是 POST 和 GET 请求的示例。 在此处输入图像描述

在此处输入图像描述

标签: c#.net-coreasp.net-core-mvcasp.net-core-webapi

解决方案


改变

[HttpPost("envelope")]

[HttpPost]

您对 POST 正文进行编码的方式将被发布到POST /envelopes/envelope端点,这似乎是您不想要的。

您在其他方法中的评论也具有误导性。例如

// DELETE /envelope/{id}

真的应该

// DELETE /envelopes/{id}.

[controller]部分[Route("[controller]")]将被替换为控制器名称的小写部分,而没有Controller(即/envelopes(复数)构成端点的基础来自EnvelopesController.

在您的 Postman 屏幕截图中,您可以看到您试图从复数/envelopes(好)获取但发布到/envelope未定义的单数。


推荐阅读