ASP.NET Core将GET调用路由到DELETE方法



我有一个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中的立即窗口告诉我HttpContext.Request.Method"GET",但我最终使用了明确标记为HttpDelete的方法。

这里发生了什么幸运的是,我的调用是在一个测试web API的自动测试中进行的,但如果有人发出调用来从DB中检索实际数据,他们最终会删除这些数据[HttpDelete]属性方面,我方是否存在误解

您不必使用route属性和order参数。这可能是造成这种情况的原因。

[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)
{
}
}

如果您有[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)
{
}
}

最新更新