WebAPI 2:使用错误的参数调用默认GET ALL

时间:2017-01-10 13:08:07

标签: c# asp.net-web-api2 asp.net-web-api-routing

我正在使用带有EF的WebAPI 2和来自visual studio的脚手架webapi控制器。 每个控制器创建4个默认动词(GET,PUT,DELETE,POST)和5个动作。虽然有两个版本的GET动作。

  1. IQueryable<entity> GetEntities ()
  2. Task<IHttpActionResult> GetEntity(GUID key) //默认为int id但我改为guid。
  3. 我正在为控制器使用属性路由和路由前缀。只是一些花哨的关键字,以更好地管理网址。 [RoutePrefix("api/v3/Company")]

    问题:

    理想情况下,当在url中发送错误的参数时,它应该返回错误,但它不会引发错误,而是回退到没有参数的操作。如果我发送错误的GUID,则显示错误。

    如果我打电话: http://localhost:8080/api/v3/Company/1f7dc74f-af14-428d-aa31-147628e965b2

    它显示了正确的结果。

    我打电话的时候: http://localhost:8080/api/v3/Company/1f7dc74f-af14-428d-aa31-147628e96500(错误的密钥)

    它回到GetEntity()功能并显示所有记录

    我打电话的时候: http://localhost:8080/api/v3/Company/1(不是GUID长度参数)

    它也会这样做并显示所有记录。

    我正在使用属性[Route("{id:guid}")]

    真的很感激,如果我能得到一些指导!

1 个答案:

答案 0 :(得分:2)

路由很可能是默认回到基于约定的映射。 您需要明确地在操作上应用路由属性,以使路由知道它是默认路由获得GET

[RoutePrefix("api/v3/Company")]
public class CompanyController : ApiController {

    //GET api/v3/Company
    [HttpGet]
    [Route("")] //Default Get
    public IQueryable GetEntities() { ... }

    //GET api/v3/Company/1f7dc74f-af14-428d-aa31-147628e965b2
    [HttpGet]
    [Route("{id:guid}")] // ALSO NOTE THAT THE PARAMETER NAMES HAVE TO MATCH
    public Task<IHttpActionResult> GetEntity(Guid id) { ... }

    //...other code removed for brevity
}

确保在web api config

中启用了属性路由
config.MapHttpAttributeRoutes();