【问题标题】:ASP.Net WebAPI area supportASP.Net WebAPI 区域支持
【发布时间】:2012-06-19 21:46:45
【问题描述】:

我正在尝试向我的 asp.net 4 RC 站点添加一些 WebAPI 支持,并希望将其放入一个区域。我已经看到有人设法在 beta (here) 上运行它,但老实说,我不知道我在 RC 中做了什么。

有人设法为 WebAPI 的 RC 添加区域支持吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api


    【解决方案1】:

    您可以将 Api 控制器放在您喜欢的任何文件夹中,您不需要像 MVC 那样创建区域。我通常做的是在 MVC 站点的“Controllers”文件夹中创建一个子文件夹“Api”。只需为您的 Api 控制器注册路由即可。

    【讨论】:

    • 谢谢。事实证明,我的任何东西都不起作用,因为我在默认路由之后注册了我的 /api/ 路由,该路由捕获了所有 api 调用
    • 我可以为 WebAPI 和 asp.net 4 站点提供 2 个 Global.asax 吗?
    • 不允许有两个具有相同名称的控制器,而 ASP MVC 区域则可以。此外,您应该在 {controller} 上添加一个约束,以便您的路由仅映射到特定命名空间中的控制器(如果您为每个“区域”创建一个 API 路由)。我构建了一个 nuget 包来自动生成约束并最终允许具有相同名称的控制器。 nuget.org/packages/UsefulBits.Web.Http.Areas
    【解决方案2】:

    Web API URL 中的支持区域

    您只需注册 Web API 路由。

    但是这个路由必须在其他路由之前注册。否则,对 Web API 的请求将被错误地处理,就好像它们是 MVC 操作一样。

    当您使用区域时,您必须考虑到区域路由的注册通常在非区域路由的注册之前完成。即,在Global.asax Application_Start 中,您有这些代码行,按以下顺序:

    AreaRegistration.RegisterAllAreas();
    // ...
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    

    第一个方法调用将调用每个找到的xxxAreaRegistration 类的RegisterArea 方法。而且,在这个配置中,你通常会有这样的东西:

    context.MapRoute(
        "AreaName_default",
        "AreaName/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
    

    如果你想在这个区域内有 Web API 控制器,你必须在这个区域之前添加 Web API 路由,像这样:

    context.Routes.MapHttpRoute("AreaName_WebApiRoute",
        "AreaName/Api/{controller}/{id}",
        new { id = RouteParameter.Optional });
    

    在这种情况下,我假设您想使用如下网址调用您的 API 控制器:/AreaName/Api/ControllerName/Id

    我通常将 Web API 控制器存储在 area 文件夹内的 Api 文件夹中,但放置它们的位置并不重要。考虑到 API 控制器无论在哪里都可以找到,如果您在不同的区域为它们使用相同的名称,您会遇到冲突:它们是通过类名找到的,而不是完全限定的(命名空间)姓名。

    简而言之:对区域没有真正的支持,但您可以将它们包含在区域内自己的文件夹中,并使其在看起来像区域内 MVC 控制器的 URL 上可用。

    支持路由命名空间

    如果您想在不同区域使用相同名称的 Web API 控制器怎么办?如果你真的想为 Web API 控制器的区域提供真正的支持,你必须实现并注册一个自定义的IHttpControllerSelector

    你有一个很好的解释,这里有一个示例实现:ASP.NET Web API: Using Namespaces to Version Web APIs

    此示例使用命名空间进行版本控制,但可以稍微修改代码以支持区域命名空间。

    【讨论】:

      【解决方案3】:

      ASP.NET MVC 4 不支持区域中的 WebAPI。

      可以扩展DefaultHttpControllerSelector 来执行此操作,但您应该仔细阅读这篇出色(且简短)的文章:ASP.NET MVC 4 RC: Getting WebApi and Areas to play nicely。它工作得很好。

      我已经成功地用便携式区域 (MVCContrib) 测试了这个解决方案。 基本上,您必须:

      • 将扩展方法“AreaRegistrationContextExtensions”放在 PA 项目中(PortableAreaRegistration.RegisterArea() 方法需要):您可以将静态类复制到 PA 项目中,但我建议将其放入共享项目中。
      • 将“AreaHttpControllerSelector”类(继承自DefaultHttpControllerSelector)添加到宿主项目中。
      • 将以下行添加到 Global.asax App_Start():

        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new AreaHttpControllerSelector(GlobalConfiguration.Configuration));

      AreaHttpControllerSelector 的实现有一个注意事项:区域名称必须与 ApiController 的命名空间相对应。例如,这是我的PortableAreaRegistration 类:

      namespace PortableAreasSample.MembershipArea
      {
          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Web;
          using MvcContrib.PortableAreas;
          using System.Web.Http;
          using System.Web.Mvc;
          using System.Web.Routing;
      
          public class MembershipRegistration : PortableAreaRegistration
          {
              public override void RegisterArea(System.Web.Mvc.AreaRegistrationContext context, IApplicationBus bus)
              {
                  // GET /MembershipArea/GetAllUsers
                  context.MapHttpRoute("MembershipApi",
                      AreaName + "/{controller}/{id}",
                      new { area=AreaName, controller = "GetAllUsers", id = RouteParameter.Optional });
              }
      
              public override string AreaName
              {
                  get { return "MembershipArea"; }
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        确保在默认路由之前注册 API 路由,否则默认路由会贪婪地捕获一切!

        【讨论】:

          【解决方案5】:

          只是为了完成,存在以下属性,这可以帮助人们摆脱束缚(谁不会听从上面 eric 的建议......)

          [Route ("api/interesting/{id?}")]
          [RoutePrefix("api/interesting")]
          

          http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-10-04
            • 2016-04-26
            • 2013-06-02
            • 2012-04-07
            • 2013-07-22
            • 2012-02-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多