我有一个asp.net web api控制器,里面有2个GET方法.一个接受字符串参数,另一个接受int参数.我只有使用web api设置的默认路由.
public HttpResponseMessage GetSearchResults(string searchTerm) { HttpResponseMessage response; //Do Work return response; } public HttpResponseMessage Get(int id) { HttpResponseMessage response; //Do Work return response; }
每次我在URL中传递一个int值时,都会调用带有string参数的GET方法.永远不会调用带有int参数的GET方法.
是否可以在同一个控制器中使用不同参数类型的2个GET方法?
-Edit-建议的重复问题是不同的,因为它询问大约2个方法具有完全相同的参数类型 - 我问的是不同的参数类型.
对的,这是可能的.开箱即用的默认配置,假设您传递searchTerm
作为查询字符串参数,您应该工作.但是,如果您尝试将其作为URL的一部分传递,例如/api/myurl/blah
,默认约定路由将尝试将其与int
方法的版本匹配并返回错误.您将需要编辑默认配置或使用属性路由.
一般来说,我发现基于约定的MVC路由在WebApi中不太有用,所以我通常禁用它并使用属性路由.
要启用属性路由,请添加
config.MapHttpAttributeRoutes();
到你的WebApi配置.
然后你可以这样标记你的方法
[HttpGet] [Route("api/myobject/")] public HttpResponseMessage GetSearchResults(string searchTerm) { HttpResponseMessage response; //Do Work return response; } [HttpGet] [Route("api/myobject/{id:int}")] public HttpResponseMessage Get(int id) { HttpResponseMessage response; //Do Work return response; }
现在,您可以通过调用第一个方法
/api/myobject?searchTerm=blah
和第二个过道
/api/myobject/1
他们不应该碰撞.
但是,如果要将searchTerm
URL设置为URL而不是查询参数,则可以将路径更改为
[Route("api/myobject/{searchTerm}")]
该api/myobject/{id:int}
路线将捕获所有的ID,api/myobject/{searchTerm}
并将捕获大部分其他内容.但是,要小心这一点,好像URL不是URL编码的奇怪事情往往会发生.
我不知道你正在寻找什么样的URL格式,所以我提供的只是简单的例子.我之前发布的链接深入研究了属性路由.它允许您按照WebApi从MVC继承的约定生成比路由更复杂的路由.