关于 ASP.NET Core 中的路由


前言

当前文章用的 .NET Core SDK 3.1。

一、添加路由服务

ConfigureServices 加入 AddRouting,即可假如路由服务,但是博主暂时不知道直接使用无参的 AddRouting 有什么意义,似乎在使用路由的时候默认就是这个。

    webHostBuilder.ConfigureServices(collection =>
    {
    
    
        // 添加路由服务
        collection.AddRouting();
    })

而在 AddRouting 的非无参重载中能够自定义路由约束,如微软官方文档的自定义路由约束示例。

二、注册路由和终结点中间件

ASP.NET Core 中的路由采用采用终结点映射的策略,即终结点路由。
通过两个中间件协作完成的,一个是 Routing 路由中间件,一个是 Endpoints 终结点中间件。
不管是 MVC 还是 WebApi,只要和路由相关,都是建立在这两个中间件之上。

注册路由中间件是在 Configure 中使用 UseRouting 方法。
注册终结点中间件是在 Configure 中使用 UseEndpoints 方法,并在 UseEndpoints 中设置 路由模板 与 应请求处理器 之间的映射。

    webHostBuilder.Configure(applicationBuilder =>
    {
    
    
        // 注册路由中间件
        applicationBuilder.UseRouting();
        // 注册终结点中间件,
        applicationBuilder.UseEndpoints(endpoints =>
        {
    
    
            const string template = @"api/{city:regex(^\d{
    
    {3}}$)}/{days:int:range(1,4)}";
            // 设置 路由模板 与 对应请求处理器之间的映射
            endpoints.MapGet(template, async (context) =>
                await context.Response.WriteAsync("hello wold"));
        });
    });

一个web应用本质上是一组终结点的集合。所谓的终结点可以理解为暴露在网络中可供外界采用Http协议调用的服务。
比如webapi,控制器中的一个action就是一个终结点。路由的作用就是建立一个请求URL模式与请求终结点之间的映射关系。
利用这种关系,不仅可以对请求进行路由解析,通过路由解析以后可选择并执行对应的终结点。(入栈路由)
还可以由你注册的URL模式与指定的路由参数的值去生成完整的URL。(出站路由)
ASP.NET Core 应用是运用请求处理器对象(RequestDelegate)来处理请求,每一个终结点都封装为 RequestDelegate 对象,并处理路由的请求。

三、终结点

1. 单纯的终结点

EndPoint 类型代表终结点,其中 EndPoint.Metadata 表示源数据集合
路由系统实际上是通过 EndPointBuilder 来构建出 EndPoint。
EndPointBuilder 作为一个 abstract 类型,终结点的构建是通过 EndPointBuilder.Build 方法来负责,
EndPointBuilder 中设置了属性 EndPointBuilder.RequestDelegate 来对应终结点的请求处理器。

2. 路由系统的终结点

RouteEndPoint 类型代表路由系统终结点,RouteEndPoint 派生自 EndPoint 类,
其中 RouteEndPoint.RoutePattern 属性代表路由模式,RouteEndPoint.Order 代表路由注册顺序
RouteEndPoint 是通过 RouteEndPointBuiler 来构建的,
RouteEndPointBuiler 派生自 EndPointBuilder, 重写了 Builder 方法。
这个类型的构造函数所指定的请求处理器(RequestDelegate),路由模式(RoutePattern)来构建出最终的 EndPoint。

3. 终结点的匹配

当应用接收到一个Http请求的时候 终结点路由中间件会根据请求的URL及其他信息从注册的终结点中选择匹配度最高的那个,
被选中的终结点的信息会附件到 HttpContext.Features 中,然后终结点中间件会从 HttpContext 中去获取终结点的信息,然后根据信息来提供对应的终结点对象并处理当前的请求。
终结点路由中间件的功能是选择终结点并会将其存放到 HttpContext 上下文中。
利用 Matcher 类来进行选择当前Http上下文相匹配的终结点,HttpRequest 对象有一个 RouteValue 属性,Matcher 对象会将其解析出来。
利用 DfaMatcher (Dfa 确定有限状态自动机)来进行选择当前Http上下文相匹配的终结点,有时会找到一个终结点,有时会找到多个终结点,然后会使用匹配度最高的那个。

猜你喜欢

转载自blog.csdn.net/Upgrader/article/details/113097228