我记录网站综合系统 -- 技术原理解析[3:我记录框架处理流程]
要分析我記錄的整個處理流程,先從wojilu的初始化入口,看看wojilu在初始化的時候到底做了些什么事情。
相關代碼:wojilu.Web\Global.asax
?
1?void?Application_Start(?object?sender,?EventArgs?e?)?{2?????????wojilu.Web.SystemInfo.Init();
3?????????wojilu.Web.Mvc.MvcFilterLoader.Init();
4?????????wojilu.Web.Jobs.WebJobStarter.Init();
5?????}
wojilu.Web.SystemInfo:系統的固定數據,比如網站根路徑、app路徑、主機(ip+端口號)名稱等。這里的信息是以后路由的參考信息,在以后URL和實際地址映射的時候將用到這里的數據。
wojilu.Web.Mvc.MvcFilterLoader:?mvc 過濾器的加載器。初始化各種過濾器,并且將各種過濾器注冊到系統之中。
wojilu.Web.Jobs.WebJobStarter:計劃任務啟動器的初始化。
WebJob:計劃任務,類似于服務的一種任務,可以指定Interval(間隔時間)。
更多計劃任務的詳細介紹:http://www.wojilu.com/Common/Page/38
通過上面這些步驟,整個系統就可以響應URL請求了。
?
接下來就是介紹一下整個MVC的流程:
?
一個標準的MVC流程是指從路由解析(Route)到頁面生成(Render)的全過程。
這些原本都是由ASP完成的任務,現在全都由wojilu系統完成了。
在詳細介紹各個Process之前,我們先看看ProcessorBase的定義吧:
?
?1?namespace?wojilu.Web.Mvc.Processors?{?2?
?3?????internal?abstract?class?ProcessorBase?{
?4?
?5?
?6?????????public?abstract?void?Process(?ProcessContext?context?);
?7?
?8?????}
?9?
10?}
ProcessorBase 是一個抽象類,里面有一個抽象的方法Process(處理),這個方法的參數是 ProcessContext(處理內容)。ProcessContext里面包含著生成頁面所需要的一切信息,從路由解析開始,數據從URL信息開始,通過各個Process一點點變得豐富。例如通過路由的時候,URL將被解釋成頁面Controller信息放入ProcessContext中,通過安全認證Process的時候,訪問權限等信息會被追加到ProcessContext中。ProcessContext作為信息的載體,貫穿于整個Process中。
了解了整個MVC流程之后,我們要問,觸發MVC的最初的地方在哪里。
我們知道,要自定義HTTP處理,就必須自己實現一個 IHttpHandler,我記錄系統要實現全部的HTTP訪問過程,必然需要實現IHttpHandler。所以wojilu的IHttpHandler實現就是整個MVC的源頭。
?
?1?/*?2??*?Copyright?2010?www.wojilu.com
?3??*?
?4??*?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");
?5??*?you?may?not?use?this?file?except?in?compliance?with?the?License.
?6??*?You?may?obtain?a?copy?of?the?License?at
?7??*?
?8??*??????http://www.apache.org/licenses/LICENSE-2.0
?9??*?
10??*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
11??*?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,
12??*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.
13??*?See?the?License?for?the?specific?language?governing?permissions?and
14??*?limitations?under?the?License.
15??*/
16?
17?using?System;
18?using?System.Web;
19?using?System.Web.SessionState;
20?
21?using?wojilu.Web.Context;
22?using?wojilu.Caching;
23?using?System.Text;
24?using?System.Collections.Generic;
25?
26?namespace?wojilu.Web.Mvc?{
27?????///?<summary>
28?????///?wojilu?mvc?的核心處理器:處理客戶端請求,將結果返回
29?????///?</summary>
30?????public?class?CoreHandler?:?IHttpHandler,?IRequiresSessionState?{
31?????????public?virtual?void?ProcessRequest(?HttpContext?context?)?{
32?????????????if?(MvcConfig.Instance.IsPageCache)?{
33?????????????????String?pageContent?=?CacheManager.GetApplicationCache().Get(?context.Request.Url.PathAndQuery?)?as?String;
34?????????????????if?(pageContent?!=?null)?{
35?????????????????????context.Response.Write(?pageContent?);
36?????????????????????return;
37?????????????????}
38?????????????}
39?????????????MvcContext?ctx?=?new?MvcContext(?new?WebContext(?context?)?);
40?????????????ProcessContext.Begin(?ctx?);
41?????????}
42?????????public?virtual?void?ProcessRequest(?IWebContext?context?)?{
43?????????????ProcessContext.Begin(?new?MvcContext(?context?)?);
44?????????}
45?????????public?Boolean?IsReusable?{
46?????????????get?{?return?true;?}
47?????????}
48?????}
49?}
?看到這個,大家不禁要問,系統怎么知道HTTP使用哪個IHttpHandler的具體實現呢?
接下來請大家打開 源代碼 wojilu.Web?的 Web.Config文件。
這里有一個httpHandlers節:
里面定義了對于各種請求的處理方法。例如,對于refresh.aspx使用wojilu.Web.Handler.RefreshServerHandler來處理,robots.txt使用System.Web.DefaultHttpHandler來處理。
最后一行里,如果這個請求不屬于其他處理方法的職責范圍的話(例如aspx),就使用wojilu.Web.Mvc.CoreHandler來處理。
1?????<httpHandlers>2?????????<add?verb="*"?path="CaptchaImage.ashx"?type="wojilu.Web.Handler.CaptchaImageHandler,?wojilu"/>?????
3?????????<!--?<add?verb="*"?path="WebForm1.aspx"?type="System.Web.UI.PageHandlerFactory"?/>?-->
4?????????<add?verb="*"?path="*.asp"?type="wojilu.Web.Handler.PageNotFoundHandler,?wojilu"/>
5?????????<add?verb="*"?path="robots.txt"?type="System.Web.DefaultHttpHandler"/>
6?????????<add?verb="*"?path="refresh.aspx"?type="wojilu.Web.Handler.RefreshServerHandler,?wojilu.Core"/>
7?????????<add?verb="*"?path="*.css,*.jpg,*.jpeg,*.gif,*.png,*.bmp,*.ico,*.js,*.htm,*.html,*.xml,*.swf,*.zip,*.7z,*.rar,*.cur"?type="System.Web.DefaultHttpHandler"/>
8?????????<add?verb="*"?path="*"?type="wojilu.Web.Mvc.CoreHandler,?wojilu"/>
9?????</httpHandlers>
這樣的話,對于aspx的頁面請求,通過查看Config知道了使用wojilu.Web.Mvc.CoreHandler來處理。通過調用wojilu.Web.Mvc.CoreHandler的ProcessRequest方法,開始處理請求,ProcessRequest的ProcessContext.Begin正式開始MVC之旅了。
Config ->
??? wojilu.Web.Mvc.CoreHandler.ProcessRequest - >
????????? wojilu.Web.Mvc.CoreHandler.ProcessRequest: ProcessContext.Begin
這里介紹了整個MVC的大體流程和進入MVC的入口方法,大家學習wojilu可以從這里作為入口。
?
下次預告: [核心]我記錄系統的路由處理? 2011/6/16
?
wojilu下載地址:http://www.wojilu.com/Forum1/Topic/1308?
我記錄網址 http://www.wojilu.com/
歡迎大家加入我記錄開發團隊
?
?
總結
以上是生活随笔為你收集整理的我记录网站综合系统 -- 技术原理解析[3:我记录框架处理流程]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新鲜的jquery插件收集
- 下一篇: poj1745