ASP.NET?MVC實現(xiàn)路由功能
1、定義路由、路由規(guī)則
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
路由是什么?
Route派生于RouteBase基類,如下:
路由能提供什么?
● 通過路由的GetRouteData()方法,獲取到封裝路由信息的RouteData類型;
● 通過路由的Constraints屬性獲取路由約束;
......
MapRoute()是RouteCollection的擴展方法:
RouteCollection是什么?
RouteCollection是RouteBase的集合類。
2、注冊路由規(guī)則
在全局文件中注冊路由規(guī)則:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { ...... RouteConfig.RegisterRoutes(RouteTable.Routes); ...... } }
原來,所有的路由規(guī)則都存放在RouteTable中類型為RouteCollection的Routes屬性中了。
3、UrlRoutingModule處理url請求,輸出MvcHandler以處理HTTP請求
UrlRoutingModule實現(xiàn)IHttpModule接口,對HttpApplication的PostResolveRequest事件進(jìn)行偵聽:
public class UrlRoutingModule : IHttpModule { public void Init(HttpApplication context) { context.PostResolveRequestCache += OnPostResolveRequestCache; } portected virtual void OnPostResolveRequestCache(object sender, EventArgs e) { //把當(dāng)前上下文封裝 HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current); //獲取當(dāng)前請求中的RouteData類型 RouteData routeData = RouteTable.Routes.GetRouteData(httpContext); if(routeData == null) { return; } //把routeData再封裝起來 RequestContext requestContext = new RequestContext{ RouteData = routeData, HttpContext = httpContext }; //從RouteData的RouteHandler屬性獲取IRouteHandler類型 //IRouteHandler的GetHttpHandler()方法獲取IHttpHandler IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext); //為當(dāng)前上下文設(shè)置HttpHandler,用于對當(dāng)前HTTP請求的處理 httpContext.RemapHandler(handler); } }
IRouteHandler是什么?
他的唯一職責(zé)是生產(chǎn)IHttpHandler實例。
public interface IRouteHandler { IHttpHandler GetHttpHandler(RequestContext requestContext); }
在MVC中默認(rèn)使用的是MvcRouteHandler,是IRouteHandler的實現(xiàn),返回類型為IHttpHandler的MvcHandler:
public class MvcRouteHandler : IRouteHander { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new MvcHandler(requestContext); } }
MvcHandler是MVC中IHttpHandler的默認(rèn)實現(xiàn)
public class MvcHandler : IHttpHandler { publci bool IsReusable{get {return false;}} public RequestContext RequestContext{get; private set;} public MvcHandler(RequestContext requestContext) { this.RequestContext = requestContext; } public void ProcessRequest(HttpContext context) { string controllerName = this.RequestContext.RouteData.Controller; IControllerFactory controllerFactory = COntrollerBuilder.Current.GetControllerFactory(); IController controller = controllerFactory.CreateController(this.RequestContext, controllerName); controller.execute(this.RequestContext); } }
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
asp.net獲取SQL所有數(shù)據(jù)庫名、所有表名、所有字段名
asp.net獲取SQL所有數(shù)據(jù)庫名、所有表名、所有字段名...2007-03-03log4net創(chuàng)建系統(tǒng)日志的詳細(xì)步驟
log4net是.Net下一個非常優(yōu)秀的開源日志記錄組件。log4net記錄日志的功能非常強大。它可以將日志分不同的等級,以不同的格式,輸出到不同的媒介。本文主要是簡單的介紹如何在Visual Studio2010(Asp.Net Mvc3.0)中使用log4net快速創(chuàng)建系統(tǒng)日志,如何擴展以輸出自定義字段2013-11-11ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程
這篇文章主要介紹了ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程,詳細(xì)介紹了發(fā)布過程遇到的問題及解決方法,對ASP.NET Core 發(fā)布到IIS相關(guān)知識感興趣的朋友一起看看吧2023-01-01ASP.NET Core中如何利用Csp標(biāo)頭對抗Xss攻擊
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何利用Csp標(biāo)頭對抗Xss攻擊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Asp.Net Core利用文件監(jiān)視進(jìn)行快速測試開發(fā)詳解
這篇文章主要給大家介紹了關(guān)于Asp.Net Core利用文件監(jiān)視進(jìn)行快速測試開發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12關(guān)于.net環(huán)境下跨進(jìn)程、高頻率讀寫數(shù)據(jù)的問題
最近老大教給我一個項目,項目要求高頻次地讀寫數(shù)據(jù),數(shù)據(jù)量也不是很大,難點在于這個規(guī)模的熱點數(shù)據(jù),變化非常頻繁,下面把我的處理方法分享到腳本之家平臺,對.net跨進(jìn)程高頻率讀寫數(shù)據(jù)相關(guān)知識感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2021-05-05