繁体   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