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
。
结果:
当我尝试 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
。
结果: