我有一个带有2个GET方法的asp.net web api控制器。一个接受字符串参数,另一个接受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方法?
CNC中 建议的重复问题是不同的,因为它询问了大约2种具有完全相同参数类型的方法 - 我询问不同的参数类型。
答案 0 :(得分:18)
是的,有可能。开箱即用的默认配置,假设您将searchTerm
作为查询字符串参数传递,您应该工作。但是,如果您尝试将其作为URL的一部分传递,例如/api/myurl/blah
,则默认约定路由将尝试将其与方法的int
版本匹配并返回错误。您必须编辑默认配置或使用Attribute Routing。
一般来说,我发现基于约定的MVC路由在WebApi中不太有用,所以我通常会禁用它并使用Attribute Routing。
要启用属性路由,请添加
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
位于网址而不是查询参数中,则可以将路由更改为
[Route("api/myobject/{searchTerm}")]
api/myobject/{id:int}
路由将捕获所有ID,api/myobject/{searchTerm}
将捕获大部分内容。但是,要小心这一点,好像URL不是URL编码的奇怪事情往往会发生。
我并不确切知道您要查找的网址格式,因此我提供的只是简单的示例。我之前发布的link深入研究了属性路由。它允许您按照WebApi从MVC继承的约定生成比路由更复杂的路由。