6

首先,我已经阅读了尽可能多的关于这个主题的文章,并安装了几个“路由调试”插件。我对 Java/Spring 更熟悉,所以我真的不知道如何使用 vs 2012 调试这个东西。(无论如何,我不能让 IISExpress 打印任何调试,更不用说我习惯使用 Spring/Tomcat 的那种调试输出.)

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

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Legal", 
          action = "Index", 
          id = UrlParameter.Optional }
    );
  }
}

现在,我可以通过默认控制器访问索引页面。但是,我正在尝试基于以下控制器访问 URL /WebApi/Metadata/:

[BreezeController]
public class WebApiController : ApiController {
  private readonly EFContextProvider<BankruptcyDbContext> _contextProvider =
    new EFContextProvider<BankruptcyDbContext>();

  [HttpGet]
  public string Metadata() {
    return _contextProvider.Metadata();
  }
}

“路由调试器”说我对 /WebApi/Metadata、/WebApi/Metadata/、/WebApi/Metadata/0 等的请求应该“匹配”,但我得到的只是 404。

Edit1:我终于找到了跟踪日志并获得了更多详细信息:

The controller for path &amp;#39;/WebApi/Metadata&amp;#39; was not found or does not implement IController
4

2 回答 2

5

确保您使用的是最新版本的 Visual Studio 2012 和Update 2等。您不仅应该在 App_Start 中有一个RouteConfig.cs文件,而且还有一个WebApiConfig.cs文件

因此,虽然 Normal MVC 路由使用 RouteConfig 类

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Web API 正在使用 WebApiConfig ,它被上面在静态类 WebApiConfig 中建议的开箱即用代码所淘汰:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}
于 2013-06-05T06:52:36.463 回答
1

您需要使用MapHttpRoute基于 ApiController 的路由的扩展来注册路由。例子:

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

顺便说一句,BreezeController 是什么,为什么在 WebApiController 上装饰它?

于 2013-05-31T03:21:51.373 回答