首先我读了很多关于这个主题的文章,并安装了几个“路由调试”插件。我对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();
}
}
“Route Debugger”表示我对/ WebApi / Metadata,/ WebApi / Metadata /,/ WebApi / Metadata / 0等的请求应该“匹配”,但我得到的只是404.
Edit1:我终于找到了跟踪日志并获得了更多细节:
The controller for path &#39;/WebApi/Metadata&#39; was not found or does not implement IController
答案 0 :(得分: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 }
);
}
}
Web API正在使用WebApiConfig,它与上面静态类WebApiConfig中建议的开箱即用代码一起被删除:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
答案 1 :(得分:1)
您需要使用基于ApiController的路由的MapHttpRoute
扩展名注册路由。例如:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
BTW,什么是BreezeController,为什么它在WebApiController上装饰?