[英]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.