你能在同一个web api控制器中使用不同参数类型的2个GET方法吗?

时间:2015-12-14 17:04:02

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

我有一个带有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种具有完全相同参数类型的方法 - 我询问不同的参数类型。

1 个答案:

答案 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继承的约定生成比路由更复杂的路由。