在我之前写的mvc专题教程详细介绍了MVC路由机制原理,今天我来给大家详细的介绍一下asp.net web api路由机制同时谈谈其与MVC的路由区别。
web api是基于Http协议轻量级封装,web api有一个好处是你可以完全脱离IIS,你可以选择在IIS(ASP.NET Host
)运行框架,也可以运行在自己的宿主程序里面(Self-Host)。
其实web api和MVC路由概念还是有相似之处,都是外部一个Http请求通过路由表,映射到一个Controller的Action方法,执行完成并返回结果。
在.NET 4.0 MVC路由相关的代码是单独封装在一个叫做System.Web.Routing.dll的程序集里面,它主要的功能是作用是把一个特定的URI的请求分发(dispatching)到对应能处理的Http Handler。
一、asp.net web api路由注册
下面来看看Web API怎么注册路由,在Application_Start里面可以找到一行如下代码:
GlobalConfiguration.Configure(WebApiConfig.Register);
类GlobalConfiguration有如下成员:
可以看到类GlobalConfiguration是被封装在程序集 System.Web.Http.WebHost.dll, v5.2.3.0
作用是为 ASP.NET 应用程序提供全局Http配置功能。其三个属性和一个静态方法分别是HttpConfiguration、HttpServer及HttpConfiguration和Configure。
在Application_Start里面类GlobalConfiguration有。调用的是方法Configure,参数是一个Action。
Action的好处是你可以把方法可以当成变量作为参数传递,这个让我屡试不爽。
在VS自动给我生成是传的参数WebApiConfig.Register,是静态类WebApiConfig的静态方法Register。
WebApiConfig.Register
下面我们就来看看类WebApiConfig有如下代码:
using System;
using System.Collections.Generic;
using System.linq;
using System.Web.Http;
using System.Web.Http.Filters;
namespace Lanhu.WebApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
注意:
Register方法里面的routeTemplate默认是为没有action这个参数的,因为web api默认是Restful API,上面是我自己加上的。如果你想让Web API可以路由类似MVC一样调用方法(RPC)一定要加上,不然会报404错误。
默认的配置如下:
Register方法参数是一个类HttpConfiguration实例,它在程序集程序集 System.Web.Http.dll, v5.2.3.0
下面我们来看看HttpConfiguration有哪些成员:
以上这类是ASP.NET Web API配置的核心类,有MediaType,有依赖注入DependencyResolver,有MessageHandlers等等。
二、asp.net MVC路由注册
同样在在Application_Start里面可以也可以找到一行注册路由规则的代码如下:
RouteConfig.RegisterRoutes(RouteTable.Routes);
类RouteConfig是VS自动给我们生成的一个类,它只有一个静态方法,参数为RouteCollection类型:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
RouteCollection类一个路由表类,其有下成员:
可以从上面看到RouteCollection类是被封装在程序集 System.Web.dll, v4.0.0.0里面的。它有一个静态属性Routes,而在Application_Start里面注册路由正好是利用的这个静态属性RouteTable.Routes。它是一个静态的对象,这样一修改可以在整个应用程序域共用。
三、总结
一、相同点
都是在Application_Start调用的注册代码
路由规则都有三个参数name,routeTemplate,defaults,而且作用都一样
二、不同点
1、注册是用的类不同
WEB API是GlobalConfiguration.Configure(WebApiConfig.Register);
而MVC是RouteConfig.RegisterRoutes(RouteTable.Routes);
WEB API的类GlobalConfiguration是封装在程序集 System.Web.Http.WebHost.dll里面
MVC是RouteConfig是VS生成的类,源码可以改。
2、注册路由参数不一样
WEB API的GlobalConfiguration.Configure是一个静态类的静态方法GlobalConfiguration的Configure是一个Action,这样可以传一个方法WebApiConfig.Register。
MVC的RouteConfig.RegisterRoutes是一个类的的静态属性RouteTable.Routes
3、路由规则集合类型及写的地方不一样
WEB API是WebApiConfig的方法Register通过改变对象的config的Routes属性(类型为HttpRouteCollection)
MVC是在RouteConfig的方法RegisterRoutes通过改变传递进来的routes静态对象(类型为RouteCollection)。