国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

2019-10-09 15:02asp.net教程網(wǎng) ASP.NET教程

學(xué)習(xí)是使用asp.net已經(jīng)有很長(zhǎng)一段時(shí)間了,現(xiàn)在就來(lái)分析一下mvc的整過(guò)過(guò)程吧。個(gè)人計(jì)劃寫(xiě)一個(gè)mvc系列的博文,僅從源代碼的角度來(lái)分析mvc。在接觸mvc時(shí)我們一定會(huì)經(jīng)歷路由,那么路由這東東是怎么搞出來(lái)的啊

學(xué)習(xí)是使用asp.net已經(jīng)有很長(zhǎng)一段時(shí)間了,現(xiàn)在就來(lái)分析一下mvc的整過(guò)過(guò)程吧。個(gè)人計(jì)劃寫(xiě)一個(gè)mvc系列的博文,僅從源代碼的角度來(lái)分析mvc。在接觸mvc時(shí)我們一定會(huì)經(jīng)歷路由,那么路由這東東是怎么搞出來(lái)的啊。在我們的web.config中有這么一句: <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 看來(lái)路由是它咋負(fù)責(zé)了。在這個(gè)dll中有一個(gè)很特殊的類(lèi)UrlRoutingModule 
我們來(lái)看看它里面主要的核心代碼吧: 

復(fù)制代碼代碼如下:


protected virtual void Init(HttpApplication application) 

if (application.Context.Items[_contextKey] == null) 

application.Context.Items[_contextKey] = _contextKey; 
application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache); 



private void OnApplicationPostResolveRequestCache(object sender, EventArgs e) 

HttpContextBase context = new HttpContextWrapper(((HttpApplication) sender).Context); 
this.PostResolveRequestCache(context); 


public virtual void PostResolveRequestCache(HttpContextBase context) 

RouteData routeData = this.RouteCollection.GetRouteData(context); 
if (routeData != null) 

IRouteHandler routeHandler = routeData.RouteHandler; 
if (routeHandler == null) 

throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, SR.GetString("UrlRoutingModule_NoRouteHandler"), new object[0])); 

if (!(routeHandler is StopRoutingHandler)) 

RequestContext requestContext = new RequestContext(context, routeData); 
context.Request.RequestContext = requestContext; 
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext); 
if (httpHandler == null) 

throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, SR.GetString("UrlRoutingModule_NoHttpHandler"), new object[] { routeHandler.GetType() })); 

if (httpHandler is UrlAuthFailureHandler) 

if (!FormsAuthenticationModule.FormsAuthRequired) 

throw new HttpException(0x191, SR.GetString("Assess_Denied_Description3")); 

UrlAuthorizationModule.ReportUrlAuthorizationFailure(HttpContext.Current, this); 

else 

context.RemapHandler(httpHandler); 




在IHttpModule.Init中注冊(cè)了一個(gè)PostResolveRequestCache事件,而該事件主要是調(diào)用PostResolveRequestCache這個(gè)方法,在這個(gè)方法里面有幾句很重要的代碼是 

復(fù)制代碼代碼如下:


RouteData routeData = this.RouteCollection.GetRouteData(context); 
IRouteHandler routeHandler = routeData.RouteHandler; 
RequestContext requestContext = new RequestContext(context, routeData); 
context.Request.RequestContext = requestContext; 
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext); 
context.RemapHandler(httpHandler); 


讓我們來(lái)分析第一句RouteData routeData = this.RouteCollection.GetRouteData(context) ,這句我們猜測(cè)是獲取路由信息。要想理解這句代碼又得回到我們程序中來(lái),我們?cè)贕lobal.asax.cs文件中的RegisterRoutes方法中,默認(rèn)有這么一句 

復(fù)制代碼代碼如下:


routes.MapRoute( 
"Default", // 路由名稱(chēng) 
"{controller}/{action}/{id}", // 帶有參數(shù)的 URL 
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數(shù)默認(rèn)值 
); 


這句代碼主要是注冊(cè)一個(gè)路由,這里的url要注意不能隨便寫(xiě),需要有controller和action。具體是怎么實(shí)現(xiàn)的了? 

復(fù)制代碼代碼如下:


public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) { 
Route route = new Route(url, new MvcRouteHandler()) { 
Defaults = new RouteValueDictionary(defaults), 
Constraints = new RouteValueDictionary(constraints), 
DataTokens = new RouteValueDictionary() 
}; 

if ((namespaces != null) && (namespaces.Length > 0)) { 
route.DataTokens["Namespaces"] = namespaces; 

routes.Add(name, route); 
return route; 


各參數(shù)如下 

復(fù)制代碼代碼如下:


routeName="Default", // 路由名稱(chēng) 
routeUrl= "{controller}/{action}/{id}", // 帶有參數(shù)的 URL 
defaults=new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數(shù)默認(rèn)值 
constraints=null 
namespaces=null 


在這里創(chuàng)建了一個(gè)Route實(shí)例并且把它加入到RouteCollection中了。 
現(xiàn)在又讓我們回到 RouteData routeData = this.RouteCollection.GetRouteData(context);這句代碼中來(lái),GetRouteData的主要代碼如下: 

復(fù)制代碼代碼如下:


public RouteData GetRouteData(HttpContextBase httpContext) 

using (this.GetReadLock()) 

foreach (RouteBase base2 in this) 

RouteData routeData = base2.GetRouteData(httpContext); 
if (routeData != null) 

return routeData; 



return null; 


在這里的base2就是我們先前調(diào)用MapRoute是添加的Route的。而Route的GetRouteData的方法如下: 

復(fù)制代碼代碼如下:


public override RouteData GetRouteData(HttpContextBase httpContext) 

string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo; 
RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults); 
if (values == null) 

return null; 

RouteData data = new RouteData(this, this.RouteHandler); 
if (!this.ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest)) 

return null; 

foreach (KeyValuePair<string, object> pair in values) 

data.Values.Add(pair.Key, pair.Value); 

if (this.DataTokens != null) 

foreach (KeyValuePair<string, object> pair2 in this.DataTokens) 

data.DataTokens[pair2.Key] = pair2.Value; 


return data; 


這個(gè)方法很復(fù)雜,有許多驗(yàn)證和檢查,我們主要關(guān)心一句 RouteData data = new RouteData(this, this.RouteHandler); 
當(dāng)然剩下 RequestContext requestContext = new RequestContext(context, routeData); 
context.Request.RequestContext = requestContext;這2句沒(méi)什么特別了。 
現(xiàn)在讓我們來(lái)看看IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);這句究竟干了些什么,意思很明白獲取Httphandler。 
那么MvcRouteHandler是如何獲取一個(gè)Httphandler的了, 

復(fù)制代碼代碼如下:


protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext) { 
requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext)); 
return new MvcHandler(requestContext); 


直接返回了一個(gè)MvcHandler實(shí)例。 
最有一句context.RemapHandler(httpHandler); 很簡(jiǎn)單很好明白吧,在HttpContext的RemapHandler方法中有這么一句 this._remapHandler = handler; 
在HttpContext中有這個(gè)屬性 

復(fù)制代碼代碼如下:


internal IHttpHandler RemapHandlerInstance 

get 

return this._remapHandler; 


那么這個(gè)東西又是什么時(shí)候調(diào)用的了,在HttpApplication的內(nèi)部類(lèi)MaterializeHandlerExecutionStep中的 void HttpApplication.IExecutionStep.Execute()方法調(diào)用 

復(fù)制代碼代碼如下:


if (httpContext.RemapHandlerInstance != null) 

httpContext.Handler = httpContext.RemapHandlerInstance; 


看到MaterializeHandlerExecutionStep這個(gè)了類(lèi)名,我想大家都能猜到吧。在內(nèi)部類(lèi)PipelineStepManager中BuildSteps方法有 

復(fù)制代碼代碼如下:


HttpApplication.IExecutionStep step = new HttpApplication.MaterializeHandlerExecutionStep(app); 
app.AddEventMapping("ManagedPipelineHandler", RequestNotification.MapRequestHandler, false, step); 


我想大家看到這里對(duì)mvc整個(gè)路由應(yīng)該有個(gè)大致的理解了吧。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 九九热在线观看 | 久久久久久久久久久久久久av | 99精品国产热久久91蜜凸 | 一区二区在线看 | 久久精品中文字幕 | 人人爽人人爽人人片av | 免费色网站| 激情小视频 | 成人av免费在线播放 | 亚洲国产精品久久久久秋霞不卡 | 在线精品一区 | 国产一区中文字幕 | 久久国产精品久久久久久电车 | 亚洲精品在线看 | 国产v亚洲v天堂无码 | 日韩精品一区二区在线观看 | 色婷婷精品国产一区二区三区 | 国产精品视频入口 | 久久久久国产一区二区三区四区 | 在线观看日韩av | 偷拍一区二区三区 | 亚洲不卡视频在线观看 | 国产一区二区精品在线 | 艹逼逼视频 | 国产精品高清在线观看 | 欧美成人高清视频 | 色婷婷综合网 | 日韩一区二区三区电影在线观看 | 欧美日韩在线电影 | 毛片在线视频 | 欧美日韩在线不卡 | 国产精品一区在线观看 | 99视频在线 | av黄色网 | 久久久久国产精品午夜一区 | 精品久久久久久久人人人人传媒 | 国产在线中文字幕 | 欧美喷水 | 亚洲精品午夜视频 | 国产精品99久久久久久久女警 | 91在线精品一区二区三区 |