找到了与webapi中的请求匹配的多个操作

时间:2016-11-28 17:51:10

标签: c# asp.net-web-api routing routes

我有各种动作的控制器,其中一个是:

mount_afp: AFPMountURL returned error 1, errno is 1

此操作有单独的路线:

[HttpGet]
public IList<string> GetFoo(string id = null)
{ ... }

当我添加另一个动作时:

routes.MapHttpRoute(
    name: "GetFoos",
    routeTemplate: "api/my/foo/{_id}",
    defaults: new { controller = "My", action = "GetFoo" }
);

请求localhost / api / my / foo /失败:

[HttpGet]
public IList<string> GetBar()
{ ... }

有人可以解释为什么会发生这种情况?我为api / my / foo指定了action =“GetFoo”,为什么它与GetBar匹配?

1 个答案:

答案 0 :(得分:2)

可能是您将路由配置为以下,并且请求没有ID - /api/my/foo

config.Routes.MapHttpRoute(
    name: "GetFoos",
    routeTemplate: "api/my/foo/{id}",
    defaults: new {controller = "My", action = "GetFoo"}
);

// Default 
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new {id = RouteParameter.Optional}
);

如果是这样, 第一条路线与 不匹配,则会抛出默认路线,但默认路线与 多项操作相匹配

注意: 如果您明确请求ID,则GetFoos路线将有效 - /api/my/foo/1

理想情况下,如果您发现自己使用了太多自定义路由,则可能需要考虑使用Web API 2中提供的路由属性,而不是在路由配置中创建单独的路由。

例如,

[RoutePrefix("Api/My")]
public class MyController : ApiController
{
    [HttpGet]
    [Route("foo/{id:int}")]
    public IList<string> GetFoo(int id)
    {
        return new string[] {"Foo1-" + id, "Foo1-" + id};
    }

    [HttpGet]
    [Route("bar/{id:int}")]
    public IList<string> GetBar(int id)
    {
        return new string[] {"Bar1-" + id, "Bar1-" + id};
    }
}