asp 区域Areas以及控制器的ApiController路由
第一二步就完成了api路由配置了,第三步完成了区域api路由,第四步是验证。
第一步:Global.asax文件配置
第一:加一条WebApiConfig.Register(GlobalConfiguration.Configuration);注意位置
第二:引入类库Microsoft.AspNet.WebApi.WebHost
第三:在App_Start下新建WebApiConfig类
using ApiRoute.App_Start;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace ApiRoute
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//新增
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
第二步:WebApiConfig类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http;
using System.Web.Http.Dispatcher;
namespace ApiRoute.App_Start
{
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//删除API默认的XML格式
config.Formatters.Remove(config.Formatters.XmlFormatter);
var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix", BindingFlags.Static | BindingFlags.Public);
if (suffix != null) suffix.SetValue(null, "ApiController");
}
}
}
第三步:区域配置
第一:新建一个区域命名为Test
第二:在TestAreaRegistration中添加api路由配置,注意修改后面的命名空间,我的是ApiRoute。
using System.Web.Http;
using System.Web.Mvc;
namespace ApiRoute.Areas.Test
{
public class TestAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Test";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Test_default",
"Test/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
//新加,注意namespace ApiRoute
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
this.AreaName + "Api",
"api/" + this.AreaName + "/{controller}/{action}/{id}",
new { area = this.AreaName, action = RouteParameter.Optional, id = RouteParameter.Optional, namespaceName = new string[] { string.Format("ApiRoute.Areas.{0}.Controllers", this.AreaName) } }
);
}
}
}
第四步:验证(页面ajax请求api)
第一:在Test区域下新建一个控制器Kaku
第二:写api类继承ApiController,这个KakuApiController是在第三步路由的格式
第三:在一个页面请求区域的api和普通控制器的api,这个页面我用的是Home下面的Index
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
namespace ApiRoute.Areas.Test.Controllers
{
public class KakuController : Controller
{
// GET: Test/Kaku
public ActionResult Index()
{
return View();
}
}
public class KakuApiController : ApiController
{
[System.Web.Http.HttpGet]
public dynamic Get()
{
return "I am AreaApi";
}
}
}
@{
ViewBag.Title = "Home Page";
}
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<button onclick="Api()">api</button>
<button onclick="AreaApi()">AreaApi</button>
<script>
function Api() {
$.ajax({
url: "/api/Home/Get",
success: function (rs) {
alert(rs);
}
});
}
function AreaApi() {
$.ajax({
url: "/api/Test/Kaku/Get",
success: function (rs) {
alert(rs);
}
});
}
</script>