Asp.net mvc ASP.NETWebAPI区域支持
我正在尝试向我的asp.NET4RC站点添加一些WebAPI支持,并希望将其放到一个区域中。我已经看到有人设法在beta()上运行这个程序,但老实说,我不知道我在RC中做什么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路由,否则默认路由将贪婪地捕获所有内
是否有人成功地将区域支持添加到WebAPI的RC中?您可以将Api控制器放在任何您喜欢的文件夹中,您不需要像MVC那样创建区域。我通常做的是在MVC站点的“Controllers”文件夹中创建一个子文件夹“Api”。只需为您的Api控制器注册路由,它就会工作。确保在默认路由之前注册Api路由,否则默认路由将贪婪地捕获所有内容 ASP.NET MVC 4在某些领域不支持WebAPI 可以扩展
DefaultHttpControllerSelector
来实现这一点,但您应该仔细阅读这篇优秀(简短)的文章:。它工作得很好
我已成功地使用便携区()测试了此解决方案。
基本上,你必须:
- 将扩展方法“AreaRegistrationContextExtensions”放入PA项目中(必须来自
method):您可以将静态类复制到PA项目中,但我建议将其放入共享项目中PortableReRegistration.RegisterArea()
- 将类“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 });