ASP.net路由原理小結
主題 | 概要 |
---|---|
Asp.net路由 | Asp.net路由原理初探 |
編輯 | 時間 |
新建 | 20170714 |
序號 | 參考資料 |
1 | http://wangqingpei557.blog.51cto.com/1009349/1312422/ |
2 | https://github.com/aspnet/Routing(路由原始碼) |
路由配置
才接觸asp.net,希望能一個專題一個專題的把問題搞明白深入些。
從最簡單的RouteConfig開始,RegisterRoutes靜態方法進行路由註冊:
MapPageRoute方法是為了使Url地址與WebForm頁面實體地址隔離,MapRoute方法是MVC固定的格式。
配置好後,在Global.asax中進行註冊:
注意這裡的引數,RouteTable.Routes屬性是一個RouteCollection。
而注意這裡的形參routes實際傳入的是RouteTable.Routes:
所以不管是WebForms的路由,還是MVC的路由,都是存放在RouteTable.Routes。
把路由資訊存放到RouteTable.Routes裡了,但是在什麼地方處理取用它呢?
UrlRoutingModule—路由物件模型的入口
這裡面的關鍵步驟是:
UrlRoutingModule繫結Application事件:
protected virtual void Init(HttpApplication application)
{
application.PostResolveRequestCache += PostResolveRequestCache;
}
PostResolveRequestCache事件是“ASP.NET 將繞過當前事件處理程式的執行,並允許快取模組以處理從快取請求時發生”。更直白的理解就是快取模組處理從快取請求時,發生此事件。
在PostResolverRequestCache方法中,該方法呼叫了本地內部的一個同名方法:
void PostResolveRequestCache(object o, EventArgs e)
{
var app = (HttpApplication)o;
PostResolveRequestCache(new HttpContextWrapper(app.Context));
}
然後例項化了一個HttpContextWrapper包裝物件,傳入該同名方法:
public virtual void PostResolveRequestCache(HttpContextBase context)
{
var rd = RouteCollection.GetRouteData(context);
//(1)匹配RouteData物件,後面分析;
var rc = new RequestContext(context, rd);
//(2)封裝計算出來的RouteData物件和當前HttpRequest物件;
IHttpHandler http = rd.RouteHandler.GetHttpHandler(rc);
//(3)使用(1)步驟計算出來的當前RouteData物件中的RouteHander屬性獲取路由處理程式IHttpHander介面;
context.Request.RequestContext = rc;
context.RemapHandler(http);
}
這裡面主要分為三個步驟:
1)、根據請求,從前面註冊的路由表中,匹配到RouteData物件;
2)、根據RouteData和HttpContext封裝一個RequestContext;
3)、根據RouteData的RouteHandler屬性獲取處理程式IHttpHander介面;
這裡要注意的是RouteHandler屬性,實際上是一個IRouteHandler介面,根據依賴倒置原則,如果匹配的是MVC路由,就是MVCRouteHandler,如果匹配的是Webform就是Webform的RouteHandler,也可以自定義RouteHandler。
這裡迷惑的可能是IRouteHandler 、IHttpHandler兩個介面之間的關係,IRouteHandler只有一個方法:
只有實現了這個方法,才能得到正確的HttpHandler。
相關文章
- ASP.NET Core端點路由 作用原理ASP.NET路由
- .NET/ASP.NET Routing路由(深入解析路由系統架構原理)ASP.NET路由架構
- SDWebImage原理小結Web
- 感知機原理小結
- innodb redo原理小結
- ASP.NET 路由ASP.NET路由
- 整合學習原理小結
- 最大熵模型原理小結熵模型
- PHP中的自定義路由使用小結PHP路由
- ASP.NET MVC路由ASP.NETMVC路由
- ASP.NET MVC輔助方法小結ASP.NETMVC
- ASP.NET MVC 5 Web程式設計2 -- URL對映(路由原理)ASP.NETMVCWeb程式設計路由
- 梯度下降法原理及小結梯度
- 線性迴歸原理小結
- 邏輯迴歸原理小結邏輯迴歸
- 編譯原理作業小結編譯原理
- ASP.NET Web API 路由ASP.NETWebAPI路由
- ASP.NET路由模型解析ASP.NET路由模型
- Sring事務原理分享小結
- XGBoost演算法原理小結演算法
- 空洞可分離卷積原理小結卷積
- K近鄰法(KNN)原理小結KNN
- 梯度提升樹(GBDT)原理小結梯度
- Android UI 顯示原理分析小結AndroidUI
- 交叉驗證(Cross Validation)原理小結ROS
- 微信小程式路由微信小程式路由
- Flutter 路由原理解析Flutter路由
- 前端路由實現原理前端路由
- 路由器工作原理路由器
- asp.net中Page.ClientScript.RegisterStartupScript用法小結ASP.NETclient
- ASP.NET HttpModule——原理ASP.NETHTTP
- Asp.Net Webapi路由基本設定ASP.NETWebAPI路由
- [譯]ASP.NET Core 2.0 路由引擎ASP.NET路由
- asp.net MVC 5 路由 RoutingASP.NETMVC路由
- ASP.NET Web API實踐系列03,路由模版, 路由慣例, 路由設定ASP.NETWebAPI路由
- asp.net Session丟失的解決辦法小結ASP.NETSession
- 認識 ASP.NET 3.5 MVC 路由 理解預設路由表ASP.NETMVC路由
- 61. 路由 路由模型繫結路由模型