[英]WebAPI 2 Attribute routing with areas not working
我無法使WEBAPI 2屬性路由工作。 我正在尋找的路由方案是/api/{product}/{controller}/{id-optional}
,所以就像/api/Vision/IdCard
。 控制器位於一個區域中,並設置如下:
namespace DataServices.Controllers.Vision
{
[RoutePrefix("api/vision")]
public class IdCardController : BaseApiController
{
[System.Web.Mvc.RequireHttps]
[Route("idcard")]
public IdCardViewModel Get(HttpRequestMessage request)
{...}
每當我做到這一點,我得到一個404 。 我包含了命名空間,因為該區域位於它自己的命名空間中。 WEBAPI屬性路由中是否支持區域?
編輯:WebApiConfig看起來像這樣:
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
該項目從一開始就是MVC項目嗎? 然后我認為您應該刪除創建該區域時創建的“ ApiAreaRegistration.cs ”文件。 它位於您的Api區域的根目錄中,它將與您的屬性路由沖突,因為它會在找到您的MVC(而非WebApi)路徑(如“api / {controller} / {action} / {id}”)之前匹配具體路線。
希望能幫助到你!
區域功能在Asp.Net Web API項目中不可用,並且使用基於命名空間的控制器等自定義方式更難維護。 我已經檢查了基於命名空間的控制器和路由的許多問題,例如單一操作方法可以通過基於命名空間的路由以及默認路由訪問。因此自定義實現不會降低我們的要求。
要解決此問題,我們可以使用簡單的方法來管理控制器路由:
//Remove default routing registration
/*config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);*/
並且僅使用基於屬性的路由,例如
[RoutePrefix("api/user/home")]
public class UserHomeController : ApiController
{
[Route]
public string Get()
{
return "Test user GET";
}
}
並針對不同的區域/模塊控制器
[RoutePrefix("api/admin/home")]
public class AdminHomeController : ApiController
{
[Route]
public string Get()
{
return "Test admin GET";
}
}
這種方法的優點是:
您需要從GlobalConfiguration對象獲取HttpConfiguration實例,並從AreaRegistration.cs的RegisterArea方法內部調用MapHttpAttributeRoutes()方法。
public override void RegisterArea(AreaRegistrationContext context)
{
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
//... omitted code
}
必須為每個區域進行此操作。 最后,您必須在'WebApiConfig'中刪除“config.MapHttpAttributes()”方法,否則您將獲得重復的異常。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.EnableCors();
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
//config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
嘗試在Application_Start
使用初始化順序進行播放:
//Config WebAPI(2) where you call config.MapHttpAttributeRoutes();
GlobalConfiguration.Configure(WebApiConfig.Register);
AreaRegistration.RegisterAllAreas();
順序非常重要 (如果我使用WebApiConfig反轉areaRegistration => WebAPI 2屬性路由將不起作用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.