我正在使用带有EF的WebAPI 2和来自visual studio的脚手架webapi控制器。 每个控制器创建4个默认动词(GET,PUT,DELETE,POST)和5个动作。虽然有两个版本的GET动作。
IQueryable<entity> GetEntities ()
Task<IHttpActionResult> GetEntity(GUID key)
//默认为int id但我改为guid。我正在为控制器使用属性路由和路由前缀。只是一些花哨的关键字,以更好地管理网址。 [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}")]
真的很感激,如果我能得到一些指导!
答案 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();