真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Controller激活與URL路由的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Controller激活與URL路由的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“Controller激活與URL路由的示例分析”這篇文章吧。

創(chuàng)新新互聯(lián),憑借10年的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)經(jīng)驗,本著真心·誠心服務的企業(yè)理念服務于成都中小企業(yè)設(shè)計網(wǎng)站有1000+案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)。

Controller的激活與URL路由

ASP.NET路由系統(tǒng)是HTTP請求抵達服務端的第一道屏障,它根據(jù)注冊的路由規(guī)則對攔截的請求進行匹配并解析包含目標Controller和Action名稱的路由信息。而當前ControllerBuilder具有用于激活Controller對象的ControllerFactory,現(xiàn)在看看兩者是如何結(jié)合起來的。

通過第2章“URL路由”的介紹我們知道,ASP.NET路由系統(tǒng)的核心是一個叫做UrlRoutingModule的HttpModule,路由的實現(xiàn)是它通過注冊代表HttpApplication的PostResolveRequestCache事件對HttpHandler的動態(tài)映射來實現(xiàn)的。具體來說,它通過以RouteTable的靜態(tài)屬性Routes代表的全局路由表對請求進行匹配并得到一個RouteData對象。RouteData具有一個實現(xiàn)了接口IRouteHandler的屬性RouteHandler,通過該屬性的GetHttpHandler方法可以得到最終被映射到當前請求的HttpHandler對象。

對于ASP.NET MVC應用來說,RouteData的RouteHandler屬性類型為MvcRouteHandler,實現(xiàn)在MvcRouteHandler中的HttpHandler提供機制基本上(不是完全等同)可以通過如下的代碼來體現(xiàn)。MvcRouteHandler維護著一個ControllerFactory對象,該對象可以在構(gòu)造函數(shù)中指定,如果沒有顯示指定則直接通過調(diào)用當前ControllerBuilder的GetControllerFactory方法獲取。

public class MvcRouteHandler : IRouteHandler

{

   private IControllerFactory _controllerFactory;

   public MvcRouteHandler(): this(ControllerBuilder.Current

       .GetControllerFactory())

   { }

   public MvcRouteHandler(IControllerFactory controllerFactory)

   {

       _controllerFactory = controllerFactory;

   }

   IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)

   {

       string controllerName = (string)requestContext.RouteData

           .GetRequiredString("controller");

       SessionStateBehavior sessionStateBehavior = _controllerFactory

           .GetControllerSessionrequestContext,  controllerName);

       requestContext.HttpContext.SetSessionStatesessionStateBehavior);< /p>

       return new MvcHandler(requestContext);

   }

}

在用于提供HttpHandler的GetHttpHandler方法中,除了返回一個實現(xiàn)了IHttpHandler接口的MvcHandler對象之外,還需要對當前HTTP上下文的會話狀態(tài)行為模式進行設(shè)置。具體的實現(xiàn)是:先通過包含在RequestContext的RouteData對象得到Controller的名稱,該名稱連同RequestContext對象一起傳入ControllerFactory的GetControllerSessionBehavior方法得到一個類型為SessionStateBehavior的枚舉。最后通過RequestContext得到當前HTTP上下文(實際上是一個HttpContextWrapper對象),并調(diào)用其SetSessionStateBehavior方法對會話狀態(tài)行為進行設(shè)置。

通過第2章“URL路由”的介紹我們知道,RouteData中的RouteHandler屬性最初來源于對應的路由對象,而當我們調(diào)用RouteCollection的擴展方法MapRoute方法時注冊的Route對象對應的RouteHandler是一個MvcRouteHandler對象。由于在創(chuàng)建MvcRouteHandler對象時并沒有顯式指定ControllerFactory,所以通過當前ControllerBuilder的GetControllerFactory方法得到的ControllerFactory默認被使用。

通過當前ControllerBuilder的GetControllerFactory方法得到的ControllerFactory僅僅用于獲取會話狀態(tài)行為模式,而MvcHandler真正將它用于創(chuàng)建Controller。如下的代碼片段基本上體現(xiàn)了MvcHandler的定義,它對請求處理的邏輯定義在BeginProce***equest方法中。

public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState

{

   //其他成員

   public RequestContext RequestContext { get; private set; }

   public bool IsReusable

   {

       get { return false; }

   }

   public MvcHandler(RequestContext requestContext)

   {

       this.RequestContext = requestContext;

   }

   IAsyncResult BeginProce***equest(HttpContext context, AsyncCallback cb,

       object extraData)

   {

       IControllerFactory controllerFactory =

           ControllerBuilder.Current.GetControllerFactory();

       string controllerName =

           this.RequestContext.RouteData.GetRequiredString("controller");

       IController controller = controllerFactory

           .CreateController(this.RequestContext, controllerName);

       if (controller is IAsyncController)

       {

           try

           {

               //調(diào)用BeginExecute/EndExecute方法以異步的方式執(zhí)行Controller

           }

           finally

           {

               controllerFactory.ReleaseController(controller);

           }

       }

       else

       {

           try

           {

               //調(diào)用Execute方法以異步的方式執(zhí)行Controller

           }

           finally

           {

               controllerFactory.ReleaseController(controller);

           }

       }

   }

}

由于MvcHandler同時實現(xiàn)了IHttpHandler和IHttpAsyncHandler接口,所以它總是以異步的方式被執(zhí)行(調(diào)用BeginProce***equest/EndProce***equest方法)。BeginProce***equest方法通過RequestContext對象得到目標Controller的名稱,然后利用當前ControllerBuilder創(chuàng)建的ControllerFactory激活Controller對象。如果Controller類型實現(xiàn)了IAsyncController接口,則以異步的方式執(zhí)行Controller,否則采用同步執(zhí)行方式。在被激活Controller對象被執(zhí)行之后,MvcHandler會調(diào)用ControllerFactory的ReleaseController對其進行釋放清理工作。

以上是“Controller激活與URL路由的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


當前名稱:Controller激活與URL路由的示例分析-創(chuàng)新互聯(lián)
新聞來源:http://weahome.cn/article/iddjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部