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

我有一个主要的API应用,其中包含路由和其他辅助类别。此应用程序引用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/{version}/{控制器}/{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"; }
   }
}

最新更新