2017-03-02 78 views
1

我有一个web API,我想添加一些asp.net页面来管理API的各个方面。如何在ASP.NET WebAPI项目中使用MVC路由

在WebApiConfig.cs文件中,我有几条路由,下面是我用来捕获API的所有路由。

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

我想添加一个新的部分,前缀为/控制推到事物的asp.net端。要做到这一点,我添加了以下到RouteConfig.cs

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

我已经加入,我将用它来管理事物的标准控制器。

public class ManageController : Controller 
{ 
    public ActionResult Index() 
    { 

     return Content("Works"); 
    } 
} 

当我在浏览器中访问/控制/管理我收到以下错误。

没有类型被发现,名为“控制”

它看起来像路线被完全绕过或者在最好的,包罗万象的从API路线追赶它,并给它的控制器匹配优先。有没有办法让我的请求抓住这条路线,而不必创建一个单独的项目?

+0

如果在单独的控制器上使用'[RoutePrefix]'属性,它将工作。它不会是一个通用的解决方案,但如果您只有某些路线嵌套在控制之下,它会更有意义。仅供参考,根据您使用的ASP.NET版本,该属性可能是'[Route]'。 – Carson

回答

3

注册的顺序是物质 您需要

config.Routes.MapHttpRoute(name: "CatchAll",routeTemplate: "{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional }); 
WebApiConfig.cs文件

注册

public class RouteConfig { 

    public static void RegisterRoutes(RouteCollection routes) { 

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

你的情况会发生什么事是,/control/manage URL由CatchAll路线从而映射控制的处理与控制和管理,以行动

为了做到这一点在Global.asax中按以下顺序进行注册:

RouteConfig.RegisterRoutes(RouteTable.Routes); 
GlobalConfiguration.Configure(WebApiConfig.Register); 
+0

我该怎么做? webapi路由文件不支持asp mvc路由。在webapi方法中注册的路由只适用于在Global.asax中继承ApiController –

+0

注册变更控制的控制器(请参阅答案) –

+0

@DanHastings这就是为什么,如上面的答案所示,您管理' RouteConfig.cs'文件,并确保它在Web API路由之前注册。 MVC控制器将从'Controller'继承 – Nkosi