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