您可以在同一个 Web api 控制器中使用 2 个具有不同参数类型的 GET 方法吗?
Can you have 2 GET methods with different parameter types within the same web api controller?
我有一个 asp.net 网络 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 值时,都会调用采用字符串参数的 GET 方法。永远不会调用采用 int 参数的 GET 方法。
是否可以在同一个控制器中使用 2 个不同参数类型的 GET 方法?
-编辑-
建议的重复问题是不同的,因为它询问了 2 个具有完全相同参数类型的方法 - 我询问的是不同的参数类型。
是的,这是可能的。开箱即用的默认配置,假设您将 searchTerm
作为查询字符串参数传递,您所拥有的应该可以工作。但是,如果您尝试将其作为 URL 的一部分传递,例如 /api/myurl/blah
,默认约定路由将尝试将其与 int
版本的方法和 return一个错误。您将必须编辑默认配置或使用 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
在 URL 而不是查询参数中,您可以将路由更改为
[Route("api/myobject/{searchTerm}")]
api/myobject/{id:int}
路由将捕获所有 ID,而 api/myobject/{searchTerm}
将捕获大部分其他内容。但是,要小心这一点,因为如果 URL 不是 URL 编码的,就会发生奇怪的事情。
我不确切地知道您正在寻找什么 URL 格式,所以我提供的只是简单的示例。我之前发布的 link 更深入地研究了属性路由。它允许您创建比 WebApi 从 MVC 继承的约定路由更复杂的路由。
我有一个 asp.net 网络 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 值时,都会调用采用字符串参数的 GET 方法。永远不会调用采用 int 参数的 GET 方法。
是否可以在同一个控制器中使用 2 个不同参数类型的 GET 方法?
-编辑- 建议的重复问题是不同的,因为它询问了 2 个具有完全相同参数类型的方法 - 我询问的是不同的参数类型。
是的,这是可能的。开箱即用的默认配置,假设您将 searchTerm
作为查询字符串参数传递,您所拥有的应该可以工作。但是,如果您尝试将其作为 URL 的一部分传递,例如 /api/myurl/blah
,默认约定路由将尝试将其与 int
版本的方法和 return一个错误。您将必须编辑默认配置或使用 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
在 URL 而不是查询参数中,您可以将路由更改为
[Route("api/myobject/{searchTerm}")]
api/myobject/{id:int}
路由将捕获所有 ID,而 api/myobject/{searchTerm}
将捕获大部分其他内容。但是,要小心这一点,因为如果 URL 不是 URL 编码的,就会发生奇怪的事情。
我不确切地知道您正在寻找什么 URL 格式,所以我提供的只是简单的示例。我之前发布的 link 更深入地研究了属性路由。它允许您创建比 WebApi 从 MVC 继承的约定路由更复杂的路由。