网站集约整合建设交流,苏州企业网站建设,网站怎么做丰富的tag标签页,邢台公司做网站有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由#xff0c;可以这样形容#xff1a;通过对URL的解析#xff0c;指定相应的处理程序。回忆下在Web Forms应用程序中使用路由的方式#xff1a;然后是MVC应用程序… 有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由可以这样形容通过对URL的解析指定相应的处理程序。回忆下在Web Forms应用程序中使用路由的方式然后是MVC应用程序再到了ASP.NET Core还可以用更简单的写法从源码上看这两个方法的实现是一样的。关键是内部UseMvc方法的内容其中的处理过程首先实例化了一个RouteBuilder对象并对它的DefaultHandler属性赋值为MvcRouteHandler。接着以其为参数执行routes.MapRoute方法。MapRoute的处理过程就是为RouteBuilder里的Routes集合新增一个Route对象。有此一个Route对象仍不夠程序里又插入了一个AttributeRoute。随后执行routes.Build()返回RouteCollection集合。该集合实现了IRouter接口。最终使用已完成配置的路由。于是又看到了熟悉的Middleware。它的核心方法里先调用了RouteCollection的RouteAsync处理。其内部又依次执行各个Route的RouteAsync方法。之前的逻辑中分别在RouteCollection里加入了AttributeRoute与Route。*循环中会判断Handler是否被赋值这是为了避免在路由已被匹配的情况下继续进行其它的匹配。从执行顺序来看很容易明白AttributeRoute比一般Route优先级高的道理。先执行AttributeRoute里的RouteAsync方法里面调用了TreeRouter的RouteAsync方法如果所有AttributeRoute路由都不能匹配则不会进一步作处理。否则的话将继续执行Handler中的RouteAsync方法。这里的Handler是MvcAttributeRouteHandler。该方法内部的处理仅是为RouteContext的Handler属性赋值。实际的操作则是要到RouterMiddleware中Invoke方法的context.Handler(context.HttpContext)这一步才被执行的。至于Route里的RouteAsync方法只有路由被匹配的时候才在OnRouteMatched里调用target的RouteAsync方法。protected override Task OnRouteMatched(RouteContext context){context.RouteData.Routers.Add(_target); return _target.RouteAsync(context);
}此处的target即是最初创建RouteBuilder时传入的MvcRouteHandler。只有路由被匹配的时候才在OnRouteMatched里调用target的RouteAsync方法。protected override Task OnRouteMatched(RouteContext context){context.RouteData.Routers.Add(_target); return _target.RouteAsync(context);
}此处的target即是最初创建RouteBuilder时传入的MvcRouteHandler。处理过程与MvcAttributeRouteHandler相似一样是要在RouterMiddleware的Invoke里才执行Handler的方法。以一张思维导图可以简单概括上述的过程。或者用三句话也可以描述整个流程。添加路由匹配地址处理请求原文地址https://www.cnblogs.com/kenwoo/p/9484499.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com