如何配置路由以在WebApiConfig中具有默认的Get和命名Get方法?

时间:2013-05-24 11:29:43

标签: asp.net-mvc asp.net-web-api asp.net-mvc-routing

我想创建以下API:

  • / API /验证/ 1

  • / API /验证/调用getFoo / 1

控制器方法:

public string Get(int id)
        {
            return "value";
        }

public string GetFoo(int id)
        {
            return "value";
        }

WebApiConfig:

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });

使用此配置我可以访问/api/verifications/getfoo/1,但/api/verifications/1会导致异常:找到与请求匹配的多个操作

如何配置路由以使用默认的Get和命名的Get方法?

2 个答案:

答案 0 :(得分:2)

我认为你只需要为第一条路线指定action。 e.g:

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { action = "Get", id = RouteParameter.Optional }, new { id = @"\d+" });

答案 1 :(得分:0)

在这里,您忽略了操作名称的标准命名约定。通常Get方法绑定请求没有参数来返回所有可用项。至于我,最好为每个操作定义不同的特定名称,例如GetOneKindOfThingsGetOtherKindOfThings,以使您的API更具自我描述性。

无论如何,您可以使用以下技巧让框架正确理解您的路线:

public string Get(int defaultId)
        {
            return "value";
        }

public string GetFoo(int id)
        {
            return "value";
        }

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{defaultId}", new { defaultId = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });