我有两个不同的类库,包含相同的名称控制器。
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和其他帮助程序类。此应用程序引用了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 控制器
我尝试更改网址路由设置但没有工作。发生了重复的控制器错误。
有没有办法覆盖控制器选择机制。简单地说,我将获得路由值(旧的或新的)并从指定的命名空间中选择控制器。
找到了多个与名为“greeting”的控制器匹配的类型。 如果为此请求提供服务的路由,则会发生这种情况 ('api / {version} / {controller} / {id}')找到了多个控制器 具有相同名称但不同的名称空间,不受支持。 “问候”请求找到了以下匹配项 控制器:OldApiService.GreetingController NewApiService.GreetingController
我认为这是asp.net web api的一个重要问题。
答案 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