Asp.net core 3.1 web api 中的 HttpPost 不允许错误 405

Error 405 not allowed on HttpPost in Asp.net core 3.1 web api

当我尝试 post 使用 postman 的原始文本时,服务器回答 405 不允许。我尝试添加

app.UseCors(选项 => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

services.AddCors();

无解。

这是应用程序的代码:

   [Route("api/[controller]")]
    [ApiController]
    public class VideoWallController : ControllerBase
    {
        // GET: api/<ValuesController>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<ValuesController>/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<ValuesController>
        [HttpPost]
        public string prova([FromBody] VideoCallBack test)
        {
            return "true;";
        }

        [HttpPost]
        public void teststring(string test)
        {

        }

        // PUT api/<ValuesController>/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<ValuesController>/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }

如果您想使用 /teststring 后缀到达该端点,您需要将其放入端点模板中:

[HttpPost("teststring")]
public void teststring(string test)
{
}

或者,正如@maghazade 所说,您可以使用控制器 URL 到达终点,而无需后缀:https://localhost:44336/api/videowall

此外,使用 Postman 访问 API 不需要 CORS 设置。 CORS 仅用于通过 Web 浏览器上的 Web 应用程序 运行 配置 API 访问。

首先,如maghazade所说,there are two endpoints for the post method。您可以尝试使用[HttpPost("teststring")],因为ferhrosa said.You也可以添加[action][Route("api/[controller]")],这样动作路线将包括他们的动作names.If你用post方法添加其他动作,路线将不再冲突。

[Route("api/[controller]/[action]")]
    [ApiController]
    public class VideoWallController : ControllerBase
    {
        // GET: api/<ValuesController>/Get
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<ValuesController>/Get/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<ValuesController>/prova
        [HttpPost]
        public string prova()
        {
            return "true;";
        }
        // POST api/<ValuesController>/teststring
        [HttpPost]
        public void teststring([FromBody]string test)
        {

        }

        // PUT api/<ValuesController>/Put/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<ValuesController>/Delete/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }

而如果你想从Body传递string test,你需要在postman中添加[FromBody]和select JSON

结果: