ASP.NET 核心路由 GET 调用到 DELETE 方法

ASP.NET Core routes GET call to DELETE method

我有一个 ASP.NET Core web API 控制器,其中(除其他外)有两个具有相同签名的方法。

缩短后,如下所示:

[Route("my/route")]
public class MyApiController : ApiController
{
    [HttpGet("{*id}", Order = 2)]
    [Route("{*id}", Order = 2)]
    public MyObject Load([FromUri] String id) => new MyObject();
    
    [HttpDelete("{*id}", Order = 1)]
    [Route("{*id}", Order = 1)]
    public void Delete([FromUri] String id)
    {
    }
}

现在,我发出一个呼叫:

GET my/route/123/456

令人震惊的是,这个调用在 Delete 方法中结束。 我确实在我的第一行有一个断点(在现实生活中,非空) Delete 方法,而 VS 中的 Immediate window 告诉我 HttpContext.Request.Method"GET",但我最终在方法中明确标记作为 HttpDelete.

这是怎么回事? 幸运的是,我的调用是在测试网络的自动化测试中发生的 API,但如果有人发出该调用以检索来自数据库的实际数据,他们最终会删除该数据。 我对[HttpDelete]属性有什么误解吗?

如果您有 [ApiController] 属性,则必须将其删除,因为您将需要完整的显式路由属性。或者使用显式路由更好

[Route("my/[action]")]
public class MyApiController : ApiController
{
    [HttpGet("my/load/{id}")]
    public MyObject Load(string id) => new MyObject();
    
     [HttpDelete("my/delete/{id}")]
     [HttpGet("my/delete/{id}")]
    public void Delete(string id)
    {
    }
}

您不必使用路线属性和订单参数。可能是造成这种情况的原因。

[Route("my/route")]
public class MyApiController : ApiController
{
    [HttpGet("{*id}")]
    public MyObject Load([FromUri] String id) => new MyObject();
    
    [HttpDelete("{*id}")]
    public void Delete([FromUri] String id)
    {
    }
}