asp.net mvc 處理流程

來源:互聯網
上載者:User

回顧一下asp.net的流程處理http://www.cnblogs.com/jianjialin/archive/2011/06/14/2080768.html和http://www.cnblogs.com/jianjialin/archive/2011/06/14/2080880.html

在處理流程裡面有兩個方法, 我們在這裡分析一下

void application_PostResolveRequestCache (object sender, EventArgs e)//下文簡稱R
void application_MapRequestHandler(object sender, EventArgs e)//下文簡稱M
R, 應用程式完成緩衝處理, 下一步進入映射構造IhttpHandler步驟.
我們在建立的HttpModule裡的application_PostResolveRequestCache 方法裡設定斷點, 發現((HttpApplication)sender).Context.CurrentHandler是null.
接下來進入application_MapRequestHandler方法
M, 應用程式完成IHttpHandler的構造.
此時((HttpApplication)sender).Context.CurrentHandler是根據請求url的尾碼, 比如.aspx那麼就是頁處理常式, 如果是.ashx那麼就是handler.
 
注意: 
1. 如果自訂了處理類型,那麼((HttpApplication)sender).Context.CurrentHandler自然就是那個handler
2. 如果自訂了處理工廠, 那麼處理工廠的getHttphandler方法在application_PostResolveRequestCache 方法之後執行, 
   我們在application_MapRequestHandler方法裡可以用((HttpApplication)sender).Context.CurrentHandler得到你在getHttphandler中確定的處理器
 
當然了. ((HttpApplication)sender).Context.CurrentHandler是可讀寫的, 意思就是說, 在application_MapRequestHandler裡面. 
你可以將處理器設定成任意你喜歡的處理器, 而忽視前面的工作!

 

OK, 下面進入asp.net mvc 流程. 當然, 這篇文章只是講解大概的流程, 讓你知道走了哪些地方, 具體分析由於本人水平有限, 還請參考我給出的文章或者自行搜尋資料

ISAPIRuntime 調用至HttpRuntime , HttpRuntime 通過HttpApplicationFactory 擷取HttpApplication,HttpApplication在產生的同時載入了所有的HttpMoudule,並且通過StepManager完

成對管線事件綁定及HttpHandler的載入。然後HttpRuntime 觸發HttpApplication 的BeginProcessRequest開始了真正的HttpRequest請求的處理過程。

HttpApplication按照管線StepManager事先設定好的事件觸發順序(asp.net管道事件),當被HttpModule訂閱的事件發生,HttpModule根據請求的資訊載入對應的HttpHandler到上下文中,並把控制權還給管線。

HttpApplication繼續按照管線進行,將所有的HttpHandler載入進來。之後過程中通過HttpModule確定使用哪個HttpHandler處理請求,直到管線調用這個 HttpHandler的ProcessRequest,這個時候HttpHandler才開始著手處理上下文中的請求,比如尋找請求的具體頁面地址,調用請求的方法,繪製視圖等等。

HttpHandler 處理完後,HttpApplication管線又將內容相關的控制交還給HttpModule,HttpModule對請求最後處理後,又把控制權還給管線繼續處理下面的事件,直到HttpRuntime 結束請求返回用戶端。

上文還是asp.net的流程. 我們啟動一個asp.net mvc應用程式. 首先進入的是global.cs全域類裡面的事件. 我們在Global.asax.cs註冊路由的時候(即HttpApplication),就已經往RouteTable.Routes添加了新的路由資訊了,因此HttpModule可以從自己的RouteCollection尋找到對應請求的路由。RouteTable只有一個靜態集合屬性RouteCollection。

 

然後呢, 不寫了. 看看高手的東西吧http://www.cnblogs.com/mecity/archive/2011/06/27/2090657.html特別注意

public virtual void PostMapRequestHandler(HttpContextBase context)    {       
    RequestData data = (RequestData) context.Items[_requestDataKey];       
    if (data != null)        {           
             context.RewritePath(data.OriginalPath);            
             context.Handler = data.HttpHandler;       
    }    
 }

這個方法, 這就是為什麼asp.net mvc流程中, 應用程式知道使用new MvcRouteHandler()來處理請求.new MvcRouteHandler()在哪定義的? 在

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()
            };
 
           ......
        }

方法中寫死了, 程式啟動的時候就設定好了. 再查看MvcRouteHandler的原始碼
public class MvcRouteHandler : IRouteHandler {
        protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext) {
            return new MvcHandler(requestContext);
        }
        #region IRouteHandler Members
        IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext) {
            return GetHttpHandler(requestContext);
        }
        #endregion
    }

這樣在application_MapRequestHandler裡面, 我們的處理常式就到了mvcHandler手裡了.接下來進入到mvcHandler的ProcessRequest方法中.通過路由資訊反射得出相關的controller和action, 然後再加以執行. 這就是我們的流程.至於選擇controller和action的細節問題, 還需要查看高手的文章.
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.