虽然ASP.NET Core应用的路由是通过RouterMiddleware这个中间件来完成的,但是具体的路由解析功能都落在指定的Router对象上,不过我们依然有必要以代码实现的角度来介绍一下这个中间件。在这之前,我们先来认识一个特殊的特性。[本文已经同步到《ASP.NET Core框架揭秘》之中]

让RouterMiddleware中间件委托Router完整整个路由工作之后,解析出来的路由参数会以一个RouteData对象的形式存储在RouteContext上下文中。但是RouteContext是为Router的执行建立的上下文,路由解析工作完成之后,这个上下文的生命周期也随着结束,既然整个RouteContext上下文都不存在了,请求处理的后续步骤如何获取这个RouteData对象呢?

通过《注册URL模式与HttpHandler的映射关系》的实例演示我们知道可以调用HttpContext的扩展方法GetRouteData来获取这个包含素所有路由参数的RouteData对象,这个意味着原本依附于RouteContext上下文的RouteData最终会被附加到代表当前请求上下文的HttpContext上,而具体承载这个RouteData的就是这个名为RoutingFeature的特性。RoutingFeature是我们对所有实现了IRoutingFeature接口的所有类型以及对应对象的统称。如下面的代码片段所示,这个接口通过属性RouteData来保存最终附加到HttpContext的RouteData。RoutingFeature类是这个接口的默认实现者,我们的RouterMiddleware默认情况下就是使用这个对象。

interface IRoutingFeature
   2: {
   3:     RouteData RouteData { get; set; }
   4: }
   5:  
class RoutingFeature : IRoutingFeature
   7: {
public RouteData RouteData { get; set; }
   9: }

相关文章: