asp.net web api路由机制原理详解--路由注册及与MVC区别

asp.net web api路由机制原理详解--路由注册及与MVC区别

4544发表于2019-04-14

在我之前写的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<HttpConfiguration>,这样可以传一个方法WebApiConfig.Register。

MVC的RouteConfig.RegisterRoutes是一个类的的静态属性RouteTable.Routes

3、路由规则集合类型及写的地方不一样

WEB API是WebApiConfig的方法Register通过改变对象的config的Routes属性(类型为HttpRouteCollection)

MVC是在RouteConfig的方法RegisterRoutes通过改变传递进来的routes静态对象(类型为RouteCollection)。


小编蓝狐