我有一个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)
{
}
}