婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

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

熱門標簽:朝陽市地圖標注 使用智能電話機器人違法嗎 太原外呼電銷機器人費用 東莞語音電銷機器人排名 外呼系統用員工身份證 保山電話外呼管理系統怎么用 蘇州銷售外呼系統預算 電話機器人廣告話術 淘寶地圖標注如何做
學習是使用asp.net已經有很長一段時間了,現在就來分析一下mvc的整過過程吧。個人計劃寫一個mvc系列的博文,僅從源代碼的角度來分析mvc。在接觸mvc時我們一定會經歷路由,那么路由這東東是怎么搞出來的啊。在我們的web.config中有這么一句: add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 看來路由是它咋負責了。在這個dll中有一個很特殊的類UrlRoutingModule
我們來看看它里面主要的核心代碼吧:
復制代碼 代碼如下:

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中注冊了一個PostResolveRequestCache事件,而該事件主要是調用PostResolveRequestCache這個方法,在這個方法里面有幾句很重要的代碼是
復制代碼 代碼如下:

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);

讓我們來分析第一句RouteData routeData = this.RouteCollection.GetRouteData(context) ,這句我們猜測是獲取路由信息。要想理解這句代碼又得回到我們程序中來,我們在Global.asax.cs文件中的RegisterRoutes方法中,默認有這么一句
復制代碼 代碼如下:

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

這句代碼主要是注冊一個路由,這里的url要注意不能隨便寫,需要有controller和action。具體是怎么實現的了?
復制代碼 代碼如下:

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;
}

各參數如下
復制代碼 代碼如下:

routeName="Default", // 路由名稱
routeUrl= "{controller}/{action}/{id}", // 帶有參數的 URL
defaults=new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值
constraints=null
namespaces=null

在這里創建了一個Route實例并且把它加入到RouteCollection中了。
現在又讓我們回到 RouteData routeData = this.RouteCollection.GetRouteData(context);這句代碼中來,GetRouteData的主要代碼如下:
復制代碼 代碼如下:

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就是我們先前調用MapRoute是添加的Route的。而Route的GetRouteData的方法如下:
復制代碼 代碼如下:

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 (KeyValuePairstring, object> pair in values)
{
data.Values.Add(pair.Key, pair.Value);
}
if (this.DataTokens != null)
{
foreach (KeyValuePairstring, object> pair2 in this.DataTokens)
{
data.DataTokens[pair2.Key] = pair2.Value;
}
}
return data;
}

這個方法很復雜,有許多驗證和檢查,我們主要關心一句 RouteData data = new RouteData(this, this.RouteHandler);
當然剩下 RequestContext requestContext = new RequestContext(context, routeData);
context.Request.RequestContext = requestContext;這2句沒什么特別了。
現在讓我們來看看IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);這句究竟干了些什么,意思很明白獲取Httphandler。
那么MvcRouteHandler是如何獲取一個Httphandler的了,
復制代碼 代碼如下:

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

直接返回了一個MvcHandler實例。
最有一句context.RemapHandler(httpHandler); 很簡單很好明白吧,在HttpContext的RemapHandler方法中有這么一句 this._remapHandler = handler;
在HttpContext中有這個屬性
復制代碼 代碼如下:

internal IHttpHandler RemapHandlerInstance
{
get
{
return this._remapHandler;
}
}

那么這個東西又是什么時候調用的了,在HttpApplication的內部類MaterializeHandlerExecutionStep中的 void HttpApplication.IExecutionStep.Execute()方法調用
復制代碼 代碼如下:

if (httpContext.RemapHandlerInstance != null)
{
httpContext.Handler = httpContext.RemapHandlerInstance;
}

看到MaterializeHandlerExecutionStep這個了類名,我想大家都能猜到吧。在內部類PipelineStepManager中BuildSteps方法有
復制代碼 代碼如下:

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

我想大家看到這里對mvc整個路由應該有個大致的理解了吧。
您可能感興趣的文章:
  • ASP.NET Core MVC 配置全局路由前綴
  • 解讀ASP.NET 5 & MVC6系列教程(11):Routing路由
  • 為ASP.NET MVC及WebApi添加路由優先級
  • ASP.NET MVC3關于生成純靜態后如何不再走路由直接訪問靜態頁面
  • ASP.NET Core中使用默認MVC路由的配置

標簽:西藏 潛江 呼倫貝爾 阿里 洛陽 克拉瑪依 綏化 運城

巨人網絡通訊聲明:本文標題《asp.net mvc路由篇 如何找到 IHttpHandler方法介紹》,本文關鍵詞  asp.net,mvc,路由,篇,如何,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《asp.net mvc路由篇 如何找到 IHttpHandler方法介紹》相關的同類信息!
  • 本頁收集關于asp.net mvc路由篇 如何找到 IHttpHandler方法介紹的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕亚洲视频| 日韩欧美国产午夜精品| 亚洲天堂网中文字| 欧美精品久久久久久久久老牛影院| 精品一区二区三区影院在线午夜| 亚洲a一区二区| 亚洲18影院在线观看| 亚洲成人资源在线| 精品福利视频一区二区三区| 欧美精品三级在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 国内精品久久久久影院色 | 国产一区免费电影| 国产一区二区三区观看| 国产精品一区在线观看乱码| 九九热在线视频观看这里只有精品 | 欧美视频中文一区二区三区在线观看| 国产91高潮流白浆在线麻豆| 成人av电影在线| 91啪亚洲精品| 日韩欧美国产一区二区三区 | 欧美videossexotv100| 久久这里只有精品视频网| 中文字幕成人av| 亚洲成a人片在线不卡一二三区| 日韩电影在线观看一区| 国产精品中文欧美| 欧美日韩视频专区在线播放| 久久亚区不卡日本| 日韩电影在线观看电影| 91一区二区三区在线观看| 欧美电影免费观看高清完整版在线观看| 欧美不卡一区二区| 午夜精品福利久久久| 成人动漫精品一区二区| 欧美成人一区二区三区片免费 | 亚洲v精品v日韩v欧美v专区| 国产一区日韩二区欧美三区| 在线视频一区二区三区| 国产人成一区二区三区影院| 青青草成人在线观看| 色成年激情久久综合| 亚洲视频在线一区观看| av资源站一区| 亚洲同性gay激情无套| 国产高清在线观看免费不卡| 国产一区中文字幕| 久久精品视频一区二区三区| 国产一区福利在线| 日韩免费观看高清完整版| 亚洲成年人影院| 欧美亚洲高清一区二区三区不卡| 国产精品国产成人国产三级 | 久久久久国产精品人| 蜜桃一区二区三区四区| 日韩欧美aaaaaa| 成人激情开心网| 午夜欧美在线一二页| 欧美一区二区三级| 国产成人av一区二区三区在线观看| 国产精品毛片a∨一区二区三区| 日本精品一区二区三区高清| 另类小说欧美激情| 亚洲人xxxx| 精品黑人一区二区三区久久| 99久久久精品免费观看国产蜜| 亚洲gay无套男同| 国产精品白丝在线| 欧美不卡一区二区| 欧美日韩精品久久久| 懂色av一区二区三区免费观看| 亚洲毛片av在线| 欧美国产日本视频| 日韩欧美黄色影院| 欧美一卡二卡三卡| 精品视频1区2区3区| 99视频一区二区| 欧美在线你懂得| 亚洲精品在线免费观看视频| 国产精品久久久久影院老司| 青青草精品视频| 91网站最新地址| 日韩激情一二三区| 日韩欧美综合在线| 国产精品1024| 国产麻豆精品久久一二三| 在线观看日产精品| 国产精选一区二区三区 | 国产精品久久久久7777按摩| 欧美高清在线一区| 91高清在线观看| 国产精品人人做人人爽人人添 | 在线观看日韩毛片| 国产精品久久久久国产精品日日| 国产精品正在播放| 国产亚洲精品资源在线26u| 激情国产一区二区 | 18成人在线观看| 播五月开心婷婷综合| 亚洲欧洲日韩在线| 一本到不卡精品视频在线观看| 国产精品沙发午睡系列990531| 国产成人精品亚洲午夜麻豆| 国产亲近乱来精品视频| 成人综合婷婷国产精品久久蜜臀 | 精品在线亚洲视频| 日韩午夜av一区| 久久69国产一区二区蜜臀| 久久色视频免费观看| 成人永久aaa| 中文字幕在线免费不卡| 在线观看91av| 婷婷亚洲久悠悠色悠在线播放| 欧美自拍丝袜亚洲| 日韩女优电影在线观看| 卡一卡二国产精品| 欧美日韩中文另类| 蜜桃传媒麻豆第一区在线观看| 精品国产自在久精品国产| 日韩精品一二区| 久久久亚洲综合| 精品一区二区在线播放| 中文字幕成人av| 99天天综合性| 美女被吸乳得到大胸91| 日韩视频一区二区三区在线播放| 国产成人精品免费| 日韩一区二区三区免费观看| 处破女av一区二区| 亚洲永久精品大片| 正在播放亚洲一区| 国产激情91久久精品导航 | 99精品视频在线观看| 国产欧美1区2区3区| 91热门视频在线观看| 亚洲精品欧美在线| 久久综合999| 不卡一区在线观看| 日本不卡123| 久久这里只有精品首页| 色丁香久综合在线久综合在线观看| 亚洲精品国产a久久久久久| 欧美岛国在线观看| 国产河南妇女毛片精品久久久 | 国产精品久久久久7777按摩| 另类小说图片综合网| 亚洲人成人一区二区在线观看| 亚洲美女淫视频| 欧美sm极限捆绑bd| 欧美日韩激情在线| 国产精品一区二区在线观看网站| 亚洲成人免费电影| www国产精品av| 欧美精品777| 成人精品在线视频观看| 精品午夜一区二区三区在线观看| 中文av一区二区| 久久久久久夜精品精品免费| 99国产欧美另类久久久精品| 国产.欧美.日韩| 久久国产综合精品| 亚洲自拍偷拍图区| 一区二区三区在线观看动漫 | 中文字幕欧美激情一区| 欧美视频日韩视频| 91黄色免费观看| 国模套图日韩精品一区二区| 久久成人18免费观看| 亚洲欧美精品午睡沙发| 中文字幕精品一区二区精品绿巨人| 久久精品国产**网站演员| 天天影视涩香欲综合网| 国产精品三级av| 精品国产伦理网| 日韩欧美另类在线| 91看片淫黄大片一级在线观看| 国产一区二区三区免费播放| 一区二区激情小说| 一区二区三区不卡在线观看| 久久蜜桃香蕉精品一区二区三区| 精品国产露脸精彩对白| 国产精品一区一区三区| 久久久精品免费网站| 美女视频黄频大全不卡视频在线播放| 国产欧美一区二区三区在线老狼| 国产精品99久久久久| 91精品国产综合久久香蕉的特点| 国产一区在线不卡| 亚洲毛片av在线| 7777精品伊人久久久大香线蕉最新版| 丝袜诱惑制服诱惑色一区在线观看| 色狠狠色噜噜噜综合网| 99re热视频精品| 国产一区二区伦理| 亚洲伊人伊色伊影伊综合网| 欧美另类变人与禽xxxxx| 高清国产一区二区| 麻豆91在线播放| 日日噜噜夜夜狠狠视频欧美人| 精品日韩成人av|