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