欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

進(jìn)入MVC處理通道

首先來(lái)看一下經(jīng)典的Asp.net處理管道的生命周期。

成都創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站建設(shè)、固陽(yáng)網(wǎng)絡(luò)推廣、重慶小程序開(kāi)發(fā)公司、固陽(yáng)網(wǎng)絡(luò)營(yíng)銷(xiāo)、固陽(yáng)企業(yè)策劃、固陽(yáng)品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供固陽(yáng)建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):18982081108,官方網(wǎng)址:www.chinadenli.net

 進(jìn)入MVC處理通道

我們知道一個(gè)ASP.NET應(yīng)用程序可以有多個(gè)HttpModule,但是只能有一個(gè)HttpHandler,并且通過(guò)這個(gè)HttpHandler的BeginProce***equest(或Proce***equest)來(lái)處理并返回請(qǐng)求,查看聲明處理管道周期可知在MapHttpHandler這個(gè)周期將會(huì)根據(jù)請(qǐng)求的URL來(lái)查詢(xún)對(duì)應(yīng)的HttpHandler,那么它是如何查找的呢。

查找系統(tǒng)web.config中的httpModules配置節(jié),在倒數(shù)第二行發(fā)現(xiàn)一個(gè)name為UrlRoutingModule-4.0的IHttpModule配置,這是查找HttpHandler的關(guān)鍵之處。下面分析一下UrlRoutingModule的代碼:

進(jìn)入MVC處理通道

    protected virtual void Init(HttpApplication application) {        if (application.Context.Items[_contextKey] != null) {            return;

        }

        application.Context.Items[_contextKey] = _contextKey;

        application.PostResolveRequestCache += OnApplicationPostResolveRequestCache;

    }    private void OnApplicationPostResolveRequestCache(object sender, EventArgs e) {

        HttpApplication app = (HttpApplication)sender;

        HttpContextBase context = new HttpContextWrapper(app.Context);

        PostResolveRequestCache(context);

    }    public virtual void PostResolveRequestCache(HttpContextBase context) {

        RouteData routeData = 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);

}

進(jìn)入MVC處理通道

可以看到UrlRoutingModule設(shè)置了一個(gè)PostResolveRequestCache事件處理方法,該方法從RouteCollection通過(guò)匹配找到請(qǐng)求對(duì)應(yīng)的路由數(shù)據(jù)RouteData(包含如Mvc中的Controller名、Action名等),然后從RouteData的屬性RouteHandler獲取一個(gè)IRouteHandler的實(shí)例,再?gòu)腎RouteHandler實(shí)例里獲取對(duì)應(yīng)的IHttpHandler實(shí)例,最后調(diào)用HttpContext的RemapHandler方法重新為HttpContext設(shè)置RemapHandlerInstance。

根據(jù)前面asp.net初始化流程分析2我們知道在獲取Httphandler時(shí)經(jīng)典模式和集成模式使用了不同的IExecutionStep,經(jīng)典模式用的是MapHandlerExecutionStep集成模式用的是MaterializeHandlerExecutionStep,查看二者的執(zhí)行方法Execute。

先看MaterializeHandlerExecutionStep。

進(jìn)入MVC處理通道

    void IExecutionStep.Execute() {

        HttpContext context = _application.Context;

        HttpRequest request = context.Request;

        IHttpHandler handler = null;        string configType = null;

        ……        if (context.RemapHandlerInstance != null){

            wr.SetScriptMapForRemapHandler();

            context.Handler = context.RemapHandlerInstance;

        }

……

}

進(jìn)入MVC處理通道

可以看到MaterializeHandlerExecutionStep中如果UrlRoutingModule模塊中在HttpContext設(shè)置了RemapHandlerInstance,則直接用RemapHandlerInstance設(shè)置HttpContext的Handler。

再看MapHandlerExecutionStep。

進(jìn)入MVC處理通道

    void IExecutionStep.Execute() {

        HttpContext context = _application.Context;

        HttpRequest request = context.Request;

        ……

        context.Handler = _application.MapHttpHandler(context, request.RequestType, request.FilePathObject, request.PhysicalPathInternal, false /*useAppConfig*/);

        ……

}

進(jìn)入MVC處理通道

在MapHandlerExecutionStep中會(huì)調(diào)用HttpApplication的MapHttpHandler方法來(lái)設(shè)置HttpContext的Handler。下面查看MapHttpHandler代碼:

進(jìn)入MVC處理通道

    internal IHttpHandler MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, bool useAppConfig) {

        IHttpHandler handler = (context.ServerExecuteDepth == 0) ? context.RemapHandlerInstance : null;        using (new ApplicationImpersonationContext()) {            if (handler != null){                return handler;

        }
        ……
    }

進(jìn)入MVC處理通道

從第一行代碼就可以看到如果HttpContext的RemapHandlerInstance不為空則直接返回HttpContext的RemapHandlerInstance(context.ServerExecuteDepth是指頁(yè)面是否使用了HttpServerUtility.Execute進(jìn)行頁(yè)面內(nèi)跳轉(zhuǎn))。這樣也就同樣使用了UrlRoutingModule模塊中在HttpContext設(shè)置的RemapHandlerInstance,至于HttpContext沒(méi)有設(shè)置的RemapHandlerInstance的情況下如何根據(jù)默認(rèn)的擴(kuò)展名匹配查找HttpHandler就不在此討論了。

通過(guò)上面的分析我們可以設(shè)想通過(guò)在UrlRoutingModule中的靜態(tài)RouteCollection屬性中注冊(cè)RouteData而且設(shè)置該RouteData的IRouteHandler(一個(gè)接口,只有一個(gè)方法GetHttpHandler用來(lái)獲取HttpHandler)來(lái)實(shí)現(xiàn)路由與HttpHandler的對(duì)應(yīng)。下面來(lái)分析一下MvcHandler是如何通過(guò)路由注冊(cè)的,首先來(lái)看RouteCollection的實(shí)現(xiàn)

進(jìn)入MVC處理通道

    public RouteCollection RouteCollection {        get {            if (_routeCollection == null) {

                _routeCollection = RouteTable.Routes;

            }            return _routeCollection;

        }        set {

            routeCollection = value;

        }

}

進(jìn)入MVC處理通道

可以看到RouteCollection其實(shí)是包裝了RouteTable中的靜態(tài)Routes,如果有Mvc項(xiàng)目經(jīng)驗(yàn)的話(huà)應(yīng)該很眼熟了,一般的Mvc程序在Global.asax中一般都有這么一段用來(lái)注冊(cè)路由:

進(jìn)入MVC處理通道

    protected void Application_Start()
    {
        ……
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        ……
    }    public class RouteConfig
    {        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

進(jìn)入MVC處理通道

而我們定義的路由設(shè)置MvcHandler的奧妙正在MapRoute方法里,這是一個(gè)擴(kuò)展方法,定義在System.Web.Mvc.RouteCollectionExtensions里:

進(jìn)入MVC處理通道

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 = CreateRouteValueDictionaryUncached(defaults),

            Constraints = CreateRouteValueDictionaryUncached(constraints),

            DataTokens = new RouteValueDictionary()

        };

        ……

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

}

進(jìn)入MVC處理通道

可以看到MapRoute注冊(cè)路由是綁定了一個(gè)MvcRouteHandler作為IRouteHandler,下面看MvcRouteHandler是如何實(shí)現(xiàn)的:

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

在這里終于看到了創(chuàng)建MvcHandler的代碼。

至此,我們應(yīng)該有一個(gè)清晰的認(rèn)識(shí)了,我們通過(guò)全局靜態(tài)屬性集合(RouteTable.Routes)去添加各種各樣的Route(但應(yīng)該在HttpModule初始化周期之前,一般是利用HttpApplication創(chuàng)建的周期在Application_Start方法中添加了我們所需要的Route規(guī)則),當(dāng)然在添加路由的時(shí)候帶上了MvcHandler這個(gè)重要的HttpHandler。然后通過(guò)UrlRoutingModule在PostResolveRequestCache周期通過(guò)查找注冊(cè)的Route獲取請(qǐng)求的RouteData以及其屬性IRouteHandler實(shí)例(至于路由是如何匹配的還要等后續(xù)的篇章繼續(xù)講),然后通過(guò)IRouteHandler實(shí)例可以通過(guò)GetHttpHandler獲取IHttpHandler并將其設(shè)置到HttpContext的RemapHandlerInstance屬性。最終在MapHttpHandler周期通過(guò)獲取HttpContext的RemapHandlerInstance實(shí)現(xiàn)了不同的HttpHandler來(lái)接管匹配不同路由的URL。

網(wǎng)站題目:進(jìn)入MVC處理通道
當(dāng)前地址:http://www.chinadenli.net/article42/jsgdhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司網(wǎng)站建設(shè)網(wǎng)站營(yíng)銷(xiāo)建站公司外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名