簡體   English   中英

Web API控制器按路線選擇

[英]Web api controller selection by route

我有兩個包含相同名稱控制器的不同類庫。

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應用程序,其中包含Route和其他幫助程序類。 此應用程序引用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控制器

我試圖更改網址路由設置,但沒有用。 發生重復的控制器錯誤。

有什么方法可以覆蓋控制器選擇機制。 簡單地說,我將獲得路由值(舊的或新的),然后從指定的名稱空間中選擇控制器。

發現了多個與名為“ greeting”的控制器匹配的類型。 如果為該請求提供服務的路由('api / {version} / {controller} / {id}')發現多個定義了相同名稱但名稱空間不同的控制器,則不支持。 “問候”請求已找到以下匹配的控制器:OldApiService.GreetingController NewApiService.GreetingController

我認為這是asp.net Web API的重要問題。

老圖書館

namespace OldApiService{

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

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

其他圖書館

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); 
        } 
    } 

}

我將使用RoutePrefix / Route屬性。

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"; }
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM