我无法使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 }
);
答案 0 :(得分:1)
该项目从一开始就是MVC项目吗?然后我认为您应删除" ApiAreaRegistration.cs "创建区域时创建的文件。它位于您的Api区域的根目录中,它将与您的属性路由冲突,因为它将匹配MVC(而非WebApi)路由,例如" api / {controller} / {action} / { ID}"在找到您的具体路线之前。
希望它有所帮助!
答案 1 :(得分:1)
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";
}
}
这种方法的优点是:
答案 2 :(得分:1)
您需要从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 }
);
}
}
答案 3 :(得分:0)
尝试使用Application_Start
中的初始化顺序播放
因此:
//Config WebAPI(2) where you call config.MapHttpAttributeRoutes();
GlobalConfiguration.Configure(WebApiConfig.Register);
AreaRegistration.RegisterAllAreas();
订单非常重要(如果我使用WebApiConfig反转areaRegistration => WebAPI 2 attributeRouting赢了