WebAPI 2属性路由,区域不起作用

时间:2015-06-23 16:18:39

标签: c# rest asp.net-web-api asp.net-mvc-routing asp.net-web-api2

我无法使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 }
            );

4 个答案:

答案 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";
     }
}

这种方法的优点是:

  • 不需要像基于命名空间的区域,自定义路由处理程序之类的自定义逻辑,因此它是更好的编码方式。
  • 只需要将属性[Route]添加到API
  • 中的可用性中

答案 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();

  • FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  • RouteConfig.RegisterRoutes(RouteTable.Routes);
  • BundleConfig.RegisterBundles(BundleTable.Bundles);

订单非常重要(如果我使用WebApiConfig反转areaRegistration => WebAPI 2 attributeRouting赢了