路由

时间:2016-11-30 16:23:54

标签: c# asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我有两个不同的类库,包含相同的名称控制器。

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的一个重要问题。

2 个答案:

答案 0 :(得分:2)

旧图书馆

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

}

答案 1 :(得分:1)

我会使用RoutePrefix / Route属性。

NODE_DEBUG=request