1

我想创建以下 API:

  • /api/verifications/1

  • /api/verifications/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 方法?

4

2 回答 2

2

我认为您只需要action为第一条路线指定。例如:

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { action = "Get", id = RouteParameter.Optional }, new { id = @"\d+" });
于 2013-05-24T11:39:10.960 回答
0

在这里,您忽略了操作名称的标准命名约定。通常Get方法绑定到不带参数的请求以返回所有可用的项目。对我来说,最好为每个操作定义不同的特定名称,例如GetOneKindOfThings并使GetOtherKindOfThings您的 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 });
于 2013-05-24T12:07:48.713 回答