.NET Core开发日志——简述路由
有過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?
總結
以上是生活随笔為你收集整理的.NET Core开发日志——简述路由的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可扩展架构设计的三个维度
- 下一篇: .NetCore Cap 结合 Rabb