【问题标题】:.Net Core not routing to POST Method but GET Method works.Net Core 不路由到 POST 方法,但 GET 方法有效
【发布时间】:2021-01-12 12:47:41
【问题描述】:

我正在使用示例 Web 应用程序进行培训。 由于未知原因,.Net Core 不会将 POST 请求路由到相应的方法。 Get 方法正在工作,但 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 请求的示例。

【问题讨论】:

  • 请显示来自 Chrome 开发者工具(网络标签)的请求和响应标头。对于 GET 和 POST。
  • 请显示请求和响应标头来自 Chrome 开发者工具(网络选项卡)
  • 发帖到/envelopes/envelope 有用吗?

标签: c# .net-core asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

改变

[HttpPost("envelope")]

[HttpPost]

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

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

// DELETE /envelope/{id}

应该是

// DELETE /envelopes/{id}.

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

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

【讨论】:

  • 谢谢。将邮寄路线更改为 /envelopes 有帮助。
猜你喜欢
  • 2019-02-24
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2021-08-31
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多