另一个ASP.Net WebAPI路由未找到

本文关键字:路由 WebAPI ASP Net 另一个 | 更新日期: 2023-09-27 18:16:23

首先,我已经阅读了尽可能多的关于这个主题的文章,并安装了几个"路由调试"插件。我更熟悉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。

第1版:我终于找到了跟踪日志,得到了更多的细节:

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

另一个ASP.Net WebAPI路由未找到

请确保您使用的是带有更新2等的Visual Studio 2012的最新版本。。您不仅应该在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 }
        );
    }
}

Web API正在使用WebApiConfig,这是用上面在静态类WebApiCConfig:中建议的开箱即用的代码来实现的

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

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

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

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