1

在我的RouteConfig我有:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute("ApiController", "api/{controller}");

  routes.MapRoute("ApiControllerAndIntegerId", "api/{controller}/{id}", null, new { id = @"^\d+$" });

  routes.MapRoute("ApiControllerActions", "api/{controller}/{action}");
}

然后我有一个LookupController.

public class LookupsController : ApiController
{
  public string Get()
  {
    return "Default Get";
  }
  // /api/lookups/custom
  [ActionName("custom")]
  public string CustomLookup()
  {
    return "Hello, World";
  }
}

如果我导航到/api/lookups/custom我仍然得到Default Get而不是Hello, World. 我究竟做错了什么?

编辑

我尝试了 和 的不同变MapHttpRouteMapRoute。两者似乎都不起作用。

4

2 回答 2

2

MVC 路由按照您定义它们的顺序进行检查。你遇到了问题/api/lookups/custom,这应该是命中"api/{controller}/{action}"。但是,在此之前你有"api/{controller}/{id}"and "api/{controller}",所以看起来其中之一正在捕捉它。我的猜测是它试图解析“自定义”,就像{id}这两个中的第一个一样。我注意到您没有在路由中指定默认控制器或操作;您可能会在发布之前将它们取出以减少空间,但是如果您没有指定默认值,我建议您这样做 - 无论它是否能够选择自己的默认值,了解您的程序的“我不知道”会很有用“不知道该怎么做”的行为是。

颠倒您指定这三个路线的顺序。如有疑问,请将最长和最具体的路线放在首位,然后逐渐变得更加模糊。将更通用的路由置于顶部往往会导致那些路由捕获本应进一步向下更具体的路由定义的东西。

于 2013-03-26T15:56:49.123 回答
1

您为 Web Api 使用了错误的配置路由,它应该MapHttpRouteMapRoute

var configuration = GlobalConfiguration.Configuration;

     configuration.Routes.MapHttpRoute(
          name: "CustomizedApi",
          routeTemplate: "api/{controller}/{action}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

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

请注意:把路线"api/{controller}/{action}/{id}"放在上面"api/{controller}/{id}"

[HttpGet]此外,在您的标记中CustomLookup支持此操作的 GET 方法:

// /api/lookups/get
public string Get()
{
    return "Default Get";
}

// /api/lookups/custom
[ActionName("custom")]
[HttpGet]
public string CustomLookup()
{
    return "Hello, World";
}

它会起作用的

于 2013-03-26T15:42:55.093 回答