[英]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和其他帮助程序类。 此应用程序引用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的重要问题。
老图书馆
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.