【发布时间】:2021-07-29 23:04:41
【问题描述】:
我有一个 .Net Core 3.1 Web API,它设置为允许所有方法用于我的测试目的。 当我在特定端点上运行 HTTP GET 请求时,我得到 405 Method Not Allowed 并且响应标头说 Allow: DELETE.
此控制器和我的其他控制器中的所有其他端点都按预期工作。
这是我的控制器代码:
[Authorize]
[Produces("application/json")]
[Route("api/User")]
public class UserAccountController : ControllerBase
{
[HttpGet]
[AllowAnonymous]
[Route("ConfirmAccountEmail")]
protected override async Task<IActionResult> ConfirmAccountEmail(string token, string email)
{
// confirm email code here...
}
[HttpDelete("{id}")]
[Route("DeleteUserAccount")]
[Authorize(Roles = AdminToken)]
public override async Task<IActionResult> DeleteUserAccount([FromRoute] int id)
{
// user delete code here...
}
}
在我的 Startup.cs 中
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime)
{
app.UseRouting();
app.UseCors(builder =>
{
builder.AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod(); // just for testing
});
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoint(e =>
{
e.MapControllers();
));
}
我尝试将 Route 和 HTTP 类型更改为 POST(并将参数作为表单数据传递)。
我尝试删除那个 Delete 端点,在这种情况下我得到 404 Not Found。所以这让我相信,出于某种原因,控制器映射正在将一个路由绑定到我的另一个路由的删除方法,但我不明白为什么。
我觉得我错过了一些明显的东西,但我不知道现在是什么。
感谢您的帮助!
【问题讨论】:
-
需要检查的一点:对 UseCors 的调用必须放在 UseRouting 之后,但在 UseAuthorization 之前。
-
谢谢,但这就是我在上面的代码中已经有了它。
-
protected override你没有收到编译器警告吗? -
@nvoigt 我不这样做,因为我的真实代码正在实现一个抽象类。但是,事实证明,这是一个问题,因为受保护的方法不能用作 API 端点。
标签: c# asp.net-core-webapi asp.net-core-3.1