C# .Net核心没有路由到POST方法,但GET方法有效

C# .Net核心没有路由到POST方法,但GET方法有效,c#,.net-core,asp.net-core-mvc,asp.net-core-webapi,C#,.net Core,Asp.net Core Mvc,Asp.net Core Webapi,我正在使用示例web应用程序进行培训。 由于未知原因,.NETCore未将POST请求路由到相应的方法。 Get方法正在工作,但POST甚至没有被激发。 POST请求返回404 我已经尝试过添加这样的注释,但没有任何帮助 有人能请求吗 [HttpPost("envelope")] 这是我的控制器的代码 namespace Receiver.Controllers { [Route("[controller]")] [ApiControll

我正在使用示例web应用程序进行培训。 由于未知原因,.NETCore未将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请求的示例。

改变

[HttpPostenvelope]

[HttpPost]

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

另外,你在其他方法中的评论也是误导性的。比如说

//删除/信封/{id}

应该是

//删除/envelopes/{id}

[Route[controller]]的[controller]部分将替换为不带控制器的控制器名称的小写部分,即/envelopes复数形式是EnvelopesController中端点的基础

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
            };
        }
    }
}


在邮递员屏幕截图中,您可以看到您试图从复数/信封中获得良好的效果,但未定义单数/信封。

请显示Chrome开发者工具网络选项卡中的请求和响应标题。对于GET和POST@mjwills,完成。请从Chrome开发者工具网络选项卡显示请求和响应标题。发送到/envelopes/envelope有效吗?谢谢。将邮寄路线更改为/信封有帮助。