Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按路由选择Web api控制器_C#_Asp.net Web Api_Asp.net Web Api2_Asp.net Web Api Routing - Fatal编程技术网

C# 按路由选择Web api控制器

C# 按路由选择Web api控制器,c#,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,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{ p

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

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"; }
   }
}
我有一个主要的WEAPI应用程序,它包含Route和其他助手类。此应用程序引用
NewApiService
OldApiService
程序集

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路由设置,但没有成功。发生重复的控制器错误

是否有任何方法可以覆盖控制器选择机制。只需获取路由值(旧的或新的)并从指定的命名空间中选择控制器


找到多个与名为“greeting”的控制器匹配的类型。 如果为该请求提供服务的路由 ('api/{version}/{controller}/{id}')发现定义了多个控制器 名称相同但名称空间不同,这是不受支持的。 “问候语”请求已找到以下匹配项 控制器:OldApiService.GreetingController NewApiService.GreetingController


我认为这是asp.net web api的一个重要问题。

我将使用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"; }
   }
}

我将使用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"; }
   }
}
旧图书馆

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

}
旧图书馆

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

}

如果您对两个库都有控制,考虑使用属性路由,因为在映射路由时总是会遇到基于约定的路由冲突。您尝试过使用RouthPyFixt属性吗?是的,我尝试了路由属性,但没有。worked@bookmarker显示您如何尝试路由属性。将WebAPI配置为WelLIF,您可以控制两个库,考虑使用属性路由,因为在映射路径时,它会遇到基于约定的路由冲突。您尝试使用RouthPyFixt属性吗?是的,我尝试了路由属性,但没有。worked@bookmarker展示你是如何尝试击溃的属性还应包括webapi配置。请记住,还要展示如何公开两个库的配置。找到了多个与名为“greeting”的控制器匹配的类型。如果为该请求提供服务的路由('api/{version}/{controller}/{id}')发现多个定义了相同名称但名称空间不同的控制器,则可能发生这种情况,这是不受支持的。“greeting”请求找到了以下匹配的控制器:OldApiService.GreetingController NewApiService.GreetingControllerMember,以显示如何公开两个库的配置。找到了多个与名为“greeting”的控制器匹配的类型。如果为该请求提供服务的路由('api/{version}/{controller}/{id}')发现多个定义了相同名称但名称空间不同的控制器,则可能发生这种情况,这是不受支持的。“问候语”请求已找到以下匹配的控制器:OldApiService.GreetingController NewApiService.GreetingController