2017-03-02 101 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