我有各种动作的控制器,其中一个是:
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匹配?
答案 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};
}
}