2016-08-01 256 views
0

我開始開發一個支持Web API 2的應用程序,因爲我只是想以REST方式檢索數據。區分web api路由和mvc路由

然後我需要添加一些HTML到網站,以便管理員管理提供的信息,所以我創建了一些控制器來返回HTML。現在我想區分Web API路由和MVC路由,而不會影響正在生產的Web API路由(如果可能)。

的Web API路線:我錯在這裏被刪除時,我首先開發這個「API」的前綴,這將解決衝突現在

public static void Register(HttpConfiguration config) 
{ 
    // Web API routes 
    config.MapHttpAttributeRoutes(); 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "{controller}/{action}/{id}", 
     defaults: 
      new { 
       controller = "Parking", 
       action = "Get", 
       id = RouteParameter.Optional 
       } 
     ); 
} 

MVC路由:默認路由。 MVC控制器名稱是管理,也就是MVC路由用於管理網站只

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

的問題是,MVC路線沒有機會匹配,因爲的WebAPI路線首先匹配。只要他們只是工作,MVC路由如何改變並不重要,因爲它們尚未投入生產;對我來說,現在保持Web API路由更好。

我已經試過:

  • 開關在Global.asax.cs中
  • 網頁API路線的登記和MVC路線的順序使用「網絡」爲前綴的MVC控制器,但路由機制認爲「網絡」是一個控制器,它沒有找到(Web API路由再次獲勝)。
  • 我無法想出適當的約束來避免這種衝突。
  • 硬編碼「管理」替換了MVC路由模式中的「{controller}」。

這裏有一些技巧來解決碰撞?

+0

然後做反web api通常會做什麼。 web api通常會在mvc之前註冊'api'前綴和映射以避免衝突。爲mvc註冊前綴並將其映射到web api路由之前。你甚至可以嘗試使用屬性路由的mvc和設置前綴有 – Nkosi

+0

我試過了,它不起作用(請參閱問題中的嘗試列表) – Luis

回答

1

最後在WebApiConfig以下約束使其:

constraints: new { controller = @"(?!web).*" } 

所以,這是我的WebApiConfig:

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "{controller}/{action}/{id}", 
       defaults: 
        new 
        { 
         controller = "Parking", 
         action = "Get", 
         id = RouteParameter.Optional 
        }, 
       constraints: new { controller = @"(?!web).*" } 
      ); 
     } 
    } 

而且我RouteConfig:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     name: "Default", 
     url: "web/{controller}/{action}/{id}", 
     defaults: new { controller = "Parking", action = "Get", id = UrlParameter.Optional } 
    ); 
} 
1

MVC控制器的Web前綴將起作用。在這種情況下,首先配置MVC的路由(在配置API的路由之前)。

添加以下約束的API

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{controller}/{action}/{id}", 
    defaults: 
     new { 
      controller = "Parking", 
      action = "Get", 
      id = RouteParameter.Optional 
      }, 
    constraints: new { controller = @"^web" }, 
); 
+0

我試過了,它不工作,儘管切換路由註冊順序之間WebAPI和MVC。我使用「web」作爲MVC的前綴,但是在解決路由時,它會輸入WebAPI路由規則,並期望「web」成爲控制器。 – Luis

+0

用忽略網頁的約束更新了答案。 – vijayst

0

只要你也知道(因爲你剛開始開發此Web API),在MVC控制器和Web API控制器已經合併/統一在MVC 6.0 (ASP.NET Core 1.0)。所以對於你是從哪個控制器繼承而來的,沒有更多的困惑。除此之外,如果使用.NET Core框架,還有很大的性能優勢。

+0

酷,我會考慮到這一點,也許它值得在這個問題上的一些研究! – Luis