ASP.NET MVC Module
ASP.NET MVC Module
?
前言
在ASP.NET中管道模型是怎么來實(shí)現(xiàn)的?在請(qǐng)求處理流程一文中大概的講述了Http Module和HttpApplication之間的關(guān)系,而并沒有涉及到Http Module怎么去實(shí)現(xiàn)和注冊(cè)。Http Module的意義很大,ASP.NET MVC框架怎么捕獲請(qǐng)求的?或者換一種方式來說ASP.NET MVC框架的入口點(diǎn)在哪里?
Http Module注冊(cè)使用
我們直接進(jìn)入主題來看一下自定義的實(shí)現(xiàn),首先在Module使用之前我們要先定義個(gè)Module,定義很簡(jiǎn)單,定義個(gè)類型并且實(shí)現(xiàn)IHttpModule接口示例代碼1-1
代碼1-1
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ?1?????public?class?CustomModule:IHttpModule ?2?????{ ?3?????????public?void?Dispose() ?4?????????{ ?5?????????????throw?new?NotImplementedException(); ?6?????????} ?7? ?8?????????public?void?Init(HttpApplication?context) ?9?????????{ 10?????????????context.BeginRequest?+=?new?EventHandler(context_BeginRequest); 11?????????????context.EndRequest?+=?new?EventHandler(context_EndRequest); 12?????????} 13? 14?????????void?context_EndRequest(object?sender,?EventArgs?e) 15?????????{ 16?????????????((HttpApplication)sender).Context.Response.Write("<h1>請(qǐng)求處理結(jié)束后進(jìn)入自定義Module</h1>"); 17?????????} 18? 19?????????void?context_BeginRequest(object?sender,?EventArgs?e) 20?????????{ 21?????????????((HttpApplication)sender).Context.Response.Write("<h1>請(qǐng)求處理開始前進(jìn)入自定義Module</h1><hr>"); 22?????????} 23?????} |
這個(gè)時(shí)候我們自定義的Module就已經(jīng)定義好了,在CustomModule類型的 Init()方法中是訂閱了HttpApplication的事件,在請(qǐng)求處理流程文中說過,這里不作講解了。
這個(gè)時(shí)候運(yùn)行程序是不行的,ASP.NET有天大的本事也不知道你自己自定義了一個(gè)Module的阿,你得告訴它我這有個(gè)自定義的Module,運(yùn)行的時(shí)候要執(zhí)行我的這個(gè)Module。
現(xiàn)在我們來把Module注冊(cè)到系統(tǒng)中,打開項(xiàng)目中的Web.config配置文件,找到<system.web>節(jié)點(diǎn)添加<httpModules>節(jié)點(diǎn).
代碼1-2
| 1 2 3 4 5 | <system.web> ????<httpModules> ??????<add?name="MyCustomModule"?type="MvcApplication.CustomModule,MvcApplication"/> ????</httpModules> ?</system.web> |
這里要說的是Name屬***“MyCustomModule”值只是Module注冊(cè)到系統(tǒng)的名稱,可通過HttpApplication實(shí)例對(duì)象.Modules["MyCustomModule"]的方式根據(jù)Name獲取到已經(jīng)注冊(cè)到系統(tǒng)中的Module
Type屬***值則為自定義的CustomModule類型所在的命名空間已經(jīng)類型名稱,逗號(hào)后面的值為CustomModule類型所在的程序集名稱。
?
這個(gè)時(shí)候還是不能運(yùn)行程序的,因?yàn)椴┲鞯氖纠绦蚴鞘褂肕VC框架的項(xiàng)目,所以要添加一個(gè)空的控制器和一個(gè)視圖。
?
右擊Controllers文件夾添加->控制器,設(shè)置名稱為HomeController,設(shè)置控制器模板為空控制器,單擊確定后,會(huì)看到控制器中有個(gè)默認(rèn)的Index()方法。
右擊Index()方法名稱,選擇添加視圖后彈出對(duì)話框點(diǎn)擊添加即可。
添加 <h2>自定義Module演示</h2><hr /> 到視圖
這樣我們?cè)倏匆幌马?xiàng)目的運(yùn)行結(jié)果:
圖1
UrlRoutingModule
這里要說的UrlRoutingModule類型就是一個(gè)系統(tǒng)定義的Module,為什么要講解它呢?因?yàn)閺乃锩婵梢钥吹较到y(tǒng)的擴(kuò)展點(diǎn),也因?yàn)樗锹酚上到y(tǒng)和MVC框架的連接點(diǎn)。
根據(jù)前面的篇幅對(duì)于路由的學(xué)習(xí),可以說是對(duì)路由有了一個(gè)基礎(chǔ)的認(rèn)識(shí),大家都知道請(qǐng)求的Url會(huì)去匹配系統(tǒng)的定義的路由模式,然后獲得一個(gè)RouteData這么一個(gè)對(duì)象實(shí)例,然后根據(jù)它里面的信息來進(jìn)行對(duì)控制器的生成操作等等后續(xù)的一些行為。
我們來看圖1來理解UrlRoutingModule的作用,或許在實(shí)際項(xiàng)目開發(fā)中不會(huì)自己去擴(kuò)展這部分內(nèi)容,但是多了解一下也沒有壞處。
圖2
UrlRoutingModule類型的內(nèi)部大概實(shí)現(xiàn)如代碼1-3
代碼1-3
| 1 2 3 4 5 6 7 8 9 10 11 | ?1?????????void?context_PostResolveRequestCache(object?sender,?EventArgs?e) ?2?????????{ ?3?????????????HttpApplication?context?=?sender?as?HttpApplication; ?4?????????????HttpContextWrapper?contextWrapper?=?new?HttpContextWrapper(context.Context); ?5? ?6?????????????RouteData?routeData?=?RouteTable.Routes.GetRouteData(contextWrapper); ?7? ?8?????????????RequestContext?requestContext?=?new?RequestContext(contextWrapper,?routeData); ?9?????????????IHttpHandler?httpHandler?=?routeData.RouteHandler.GetHttpHandler(requestContext); 10?????????????httpHandler.ProcessRequest(context.Context); 11?????????} |
IRouteHandler、IHttpHandler
在上面的代碼1-3中,httpHandler變量是通過RouteData對(duì)象下的RouteHandler屬***里的GetHttpHandler()方法來根據(jù)請(qǐng)求上下文對(duì)象RequestContext獲取的。
這里捎帶一句,關(guān)于RequestContext類型(不是對(duì)象類型,是參數(shù)上下文類型)在MVC后續(xù)的學(xué)習(xí)中會(huì)經(jīng)常見到,這也算是一種開發(fā)中的模式吧,RequestContext對(duì)象中封裝了HttpContextBase對(duì)象和RouteData對(duì)象。
接著剛才的話題,MvcRouteHandler類型已經(jīng)實(shí)現(xiàn)了IRouteHandler類型,細(xì)心的朋友在閱讀前面的文章會(huì)發(fā)現(xiàn),在MVC中注冊(cè)路由的時(shí)候?yàn)槊總€(gè)自定義路由規(guī)則(也就是Route對(duì)象)實(shí)例化的時(shí)候是用默認(rèn)的MvcRouteHandler類型,從而會(huì)轉(zhuǎn)變到RouteData的RouteHandler屬***里,在MvcRouteHandler類型的默認(rèn)實(shí)現(xiàn)里,GetHttpHandler()方法返回的是MvcHandler,然后就像上面所說的那樣。在IHttpHandler接口中定義了一個(gè)ProcessRequest()方法,這個(gè)方法就是MVC框架中請(qǐng)求->路由->控制器的一個(gè)過程。這部分內(nèi)容會(huì)在控制器部分說明。
? ? ?本文轉(zhuǎn)自jinyuan0829 51CTO博客,原文鏈接:http://blog.51cto.com/jinyuan/1423998,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC Module的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jqGrid参数详解
- 下一篇: 配置CITRIX XML 服务与IIS