这篇文章,我们来讲一讲什么是路由。
路由是
这里需要注意一个内容,发送到应用的可执行终结点。
路由的分类:
常规路由和属性路由,
常规路由
常规路由在asp.net core程序中可以看出是
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
以上是简化的模式,原先模式为
思路就是一个控制器将指定的URL进行解析,真正进行终结点的操作就是通过使用useEndpoints()了实现。
属性路由
在创建的程序中,我们可以看到属性路由的终结点定义如下
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
简化后如下
对于RESTFul API,微软推荐使用属性路由,它在控制器或操作上定义。
那么什么是终结点路由呢?
终结点路由
我们先看一下这段代码
在此代码中,其中有 2 个是与路由相关的中间件:
(1). UseRouting()中间件。
(2). MapControllerRoute()中间件。
这 2 个中间件是成对出现的,相互依赖,缺谁都不能完整的实现路由功能。
网上查找信息后发现:
路由服务
路由服务是在 Program.cs 中使用 builder.Services.AddRouting()注册的,只是默认在 builder 之前已经注册过了,无需我们再次注册。
AddRouting()方法必须在 UseRouting()方法之前运行,它是路由的基础服务。
UseRouting
此方法中会在IApplicationBuilder 注册一个名称为EndpointRoutingMiddleware 的中间件,核心功能是
一句话总结,UseRouting()的功能就是根据 HTTP 请求匹配到正确的终结点。如果向看一下到时候路由过去的终结点是在哪里,可以在program中加入以下代码
app.Use((context, next) => {
//得到终结点
var endpoint = context.GetEndpoint();
//得到路由数据
var routeData = context.Request.RouteValues;
return next();
});
在这里,构建好了一个 RequestDelegate 委托,这个就是供UseEndpoints()中间件最终执行的请求委托,类型是Func<HttpCotnext,Task>
所以根据以上分析,就可以得出——>
一个终结点就是一个处理请求的委托,其中包含控制器,action和attribute等。
UseEndpoints()
在这里你可能会有个疑问,就是我请求了,到了终结点了,该怎么返回给我才能响应到前端?
前文中说到,为什么要成对出现
(1). UseRouting()中间件。
(2). MapControllerRoute()中间件。
那是因为(1)是为了将所有的终结点存放在endPoint.DataSource属性中,而在UseEndPoints中,——》再存入到RouteOptions集合中。经过了UseRouting和MapControllerRoute执行后,整个应用程序的路由表就生成了,之后就可以匹配到终结点,从而执行相应的请求委托。
如果中间存在UseAuthorization(),会增加一个校验来做判断是否有权限执行,没有将直接返回。