0

的Web API控制器選擇我有一個包含同名控制器兩種不同的類庫。按航線

namespace OldApiService{ 
    public class GreetingController: ApiController{ 
     public string Get(){ return "hello from old api"; } 
    } 
} 

namespace NewApiService{ 
    public class GreetingController: ApiController{ 
     public string Get(){ return "hello from new api"; } 
    } 
} 

而且我有一個主要We Api applciation包含路由和其他輔助類。本申請參考NewApiServiceOldApiService組件。

namespace MyApi { 
    public class Startup 
    {    
     public void Configuration(IAppBuilder appBuilder) 
     { 
      HttpConfiguration config = new HttpConfiguration(); 
      config.Routes.MapHttpRoute( 
       name: "DefaultApi", 
       routeTemplate: "api/{api}/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      appBuilder.UseWebApi(config); 
     } 
    } 
} 

我想選擇一個指定url參數的控制器。

http://localhost:4035/api/old/greeting將使用OldApiService控制器

http://localhost:4035/api/new/greeting將使用NewApiService控制器

我試圖改變URL路由設置,但沒有奏效。發生重複的控制器錯誤。

有什麼辦法來覆蓋控制器選擇機制。簡單地說,我將得到路由值(舊的或新的)並從指定的命名空間中選擇控制器。

多種類型的發現名爲「問候」控制器匹配。 如果服務該請求 (「API/{版本}/{控制器}/{ID}」)中得到的多個控制器的路由定義 具有相同名稱但不同的命名空間,其中不支持此可能發生。 爲「問候」的請求已發現以下的匹配 控制器:OldApiService.GreetingController NewApiService.GreetingController

我認爲這是asp.net網頁API的一個重要問題。

+2

如果你有兩個庫的控制考慮使用屬性的路由作爲總會有一個通過基於約定的路由衝突ks在控制名稱映射路由時。 – Nkosi

+0

您是否嘗試過使用RoutePrefix屬性? – peinearydevelopment

+0

是的,我嘗試過路由屬性,但沒有工作 – barteloma

回答

1

我會用RoutePrefix /路由屬性。

namespace OldApiService{ 
    [RoutePrefix("api/old/greeting")] 
    public class GreetingController: ApiController{ 
     [Route("")] 
     public string Get(){ return "hello from old api"; } 
    } 
} 

namespace NewApiService{ 
    [RoutePrefix("api/new/greeting")] 
    public class GreetingController: ApiController{ 
     [Route("")] 
     public string Get(){ return "hello from new api"; } 
    } 
} 
+0

還請記住如何顯示兩個庫的配置 – Nkosi

+0

發現多個類型與名爲'greeting'的控制器相匹配。如果爲該請求提供服務的路由('api/{version}/{controller}/{id}')找到多個使用相同名稱但不同名稱空間定義的控制器(不受支持),則會發生這種情況。對「問候」的請求已找到以下匹配的控制器:OldApiService.GreetingController NewApiService.GreetingController – barteloma

2

老圖書館

​​

其他圖書館

namespace NewApiService{ 

    public static class WebApiConfig { 
     public static void Register(HttpConfiguration config) { 
      config.config.MapHttpAttributeRoutes();   
     } 
    } 

    [RoutePrefix("api/new/greeting")] 
    public class GreetingController: ApiController{ 
     [Route("")] 
     public string Get(){ return "hello from new api"; } 
    } 
} 

啓動

namespace MyApi { 

    public class Startup { 
     public void Configuration(IAppBuilder appBuilder) { 

      var config = new HttpConfiguration(); 

      //Map attribute routes 

      OldApiService.WebApiConfig.Register(config); 
      NewApiService.WebApiConfig.Register(config); 

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

      appBuilder.UseWebApi(config); 
     } 
    } 

}