簡體   English   中英

WebAPI 2屬性路由,區域不起作用

[英]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";
     }
}

這種方法的優點是:

  • 不需要自定義邏輯,如基於命名空間的區域,自定義路由處理程序,因此它更好的編碼方式。
  • 只需要將屬性[Route]添加到API中的可用性中

您需要從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();

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

順序非常重要 (如果我使用WebApiConfig反轉areaRegistration => WebAPI 2屬性路由將不起作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM