还没有找到另一个ASP.Net WebAPI路由

Bro*_*and 6 .net c# asp.net-mvc asp.net-web-api breeze

首先我读了很多关于这个主题的文章,并安装了几个"路由调试"插件.我对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 }
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以通过默认控制器点击索引页面.但是,我试图基于以下控制器点击URL/WebApi/Metadata /:

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

  [HttpGet]
  public string Metadata() {
    return _contextProvider.Metadata();
  }
}
Run Code Online (Sandbox Code Playgroud)

"Route Debugger"表示我对/ 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
Run Code Online (Sandbox Code Playgroud)

Tom*_*kel 5

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

因此,虽然普通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 }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

Web API正在使用WebApiConfig,它与上面静态类WebApiConfig中建议的开箱即用代码一起被删除:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}
Run Code Online (Sandbox Code Playgroud)