Asp.net mvc ASP.NETWebAPI区域支持

Asp.net mvc ASP.NETWebAPI区域支持,asp.net-mvc,asp.net-web-api,Asp.net Mvc,Asp.net Web Api,我正在尝试向我的asp.NET4RC站点添加一些WebAPI支持,并希望将其放到一个区域中。我已经看到有人设法在beta()上运行这个程序,但老实说,我不知道我在RC中做什么 是否有人成功地将区域支持添加到WebAPI的RC中?您可以将Api控制器放在任何您喜欢的文件夹中,您不需要像MVC那样创建区域。我通常做的是在MVC站点的“Controllers”文件夹中创建一个子文件夹“Api”。只需为您的Api控制器注册路由,它就会工作。确保在默认路由之前注册Api路由,否则默认路由将贪婪地捕获所有内

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


是否有人成功地将区域支持添加到WebAPI的RC中?

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

确保在默认路由之前注册Api路由,否则默认路由将贪婪地捕获所有内容

ASP.NET MVC 4在某些领域不支持WebAPI

可以扩展
DefaultHttpControllerSelector
来实现这一点,但您应该仔细阅读这篇优秀(简短)的文章:。它工作得很好

我已成功地使用便携区()测试了此解决方案。 基本上,你必须:

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

    GlobalConfiguration.Configuration.Services.Replace(类型为(IHTTP控制器选择器),新区域Http控制器选择器(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"; }
        }
    }
}

最后,以下属性的存在可以帮助人们摆脱困境(谁不会听从上面eric的建议…)


web API URL中的支持区域

您只需注册Web API路由

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

使用区域时,必须考虑到区域路线的注册通常在非区域路线注册之前完成。也就是说,在
Global.asax应用程序\u 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 });
在本例中,我假设您希望使用如下url调用API控制器:
/AreaName/API/ControllerName/Id

我通常将Web API控制器存储在area文件夹中的
API
文件夹中,但放在哪里并不重要。考虑到API控制器在任何地方都可以找到,如果在不同的区域中使用相同的名称,则会出现冲突:它们是通过类名找到的,而不是通过完全限定(命名空间)的名称找到的

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

支持路由名称空间

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

这里有一个很好的解释和一个示例实现:


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

谢谢。原来什么都没有!由于我在默认路由之后注册了/api/route,该路由捕获了所有api调用。我的WebAPI和asp.net 4站点都有2个Global.asax?不允许有两个同名控制器,而asp MVC区域则可以。此外,您还应该在{controller}上添加一个约束,以便您的路由只映射到特定命名空间中的控制器(如果您为每个“区域”创建API路由)。我构建了一个nuget包来自动生成约束,并最终允许使用相同名称的控制器。
context.Routes.MapHttpRoute("AreaName_WebApiRoute",
    "AreaName/Api/{controller}/{id}",
    new { id = RouteParameter.Optional });