MapVerb: MapPost,MapPut 等等都和它类似,它将处理程序作为一个 RequestDelegate 委托提供了出来,也就是说我们实际上在自己处理HttpContext的东西,不会经过RouteHandler处理。
MapMiddlewareRoute:需要传入一个 IApplicationBuilder 委托,实际上 IApplicationBuilder Build之后也是一个 RequestDelegate,它会在内部 new 一个 RouteHandler 类,然后调用的 MapRoute。
这些所有的矛头都指向了 RouteHandler , 我们来看看 RouteHandler 吧。
public class RouteHandler : IRouteHandler, IRouter { // ...略 public Task RouteAsync(RouteContext context) { context.Handler = _requestDelegate; return TaskCache.CompletedTask; } }
什么都没干,仅仅是将传入进来的 RequestDelegate 赋值给了 RouteContext 的处理程序。
最后,代码会执行到 RouterMiddleware 类中的 Invoke 方法的最后一行 await context.Handler(context.HttpContext),这个时候开始调用Handler委托,执行用户代码。
总结
我们来总结一下以上流程:
首先传入请求会到注册的 RouterMiddleware 中间件,然后它 RouteAsync 按顺序调用每个路由上的方法。当一个请求到来的时候,IRouter实例选择是否处理已经设置到 RouteContext Handler 上的一个非空 RequestDelegate。如果Route已经为该请求设置处理程序,则路由处理会中止并且开始调用设置的Hanlder处理程序以处理请求。如果当前请求尝试了所有路由都没有找到处理程序的话,则调用next,将请求交给管道中的下一个中间件。
关于路由模板和参数约束源码处理流程就不一一说了,有兴趣可以直接看下源码。