溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Controller激活與URL路由的示例分析

發布時間:2021-11-30 15:21:39 來源:億速云 閱讀:192 作者:小新 欄目:編程語言

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

Controller的激活與URL路由

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

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

對于ASP.NET MVC應用來說,RouteData的RouteHandler屬性類型為MvcRouteHandler,實現在MvcRouteHandler中的HttpHandler提供機制基本上(不是完全等同)可以通過如下的代碼來體現。MvcRouteHandler維護著一個ControllerFactory對象,該對象可以在構造函數中指定,如果沒有顯示指定則直接通過調用當前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方法中,除了返回一個實現了IHttpHandler接口的MvcHandler對象之外,還需要對當前HTTP上下文的會話狀態行為模式進行設置。具體的實現是:先通過包含在RequestContext的RouteData對象得到Controller的名稱,該名稱連同RequestContext對象一起傳入ControllerFactory的GetControllerSessionBehavior方法得到一個類型為SessionStateBehavior的枚舉。最后通過RequestContext得到當前HTTP上下文(實際上是一個HttpContextWrapper對象),并調用其SetSessionStateBehavior方法對會話狀態行為進行設置。

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

通過當前ControllerBuilder的GetControllerFactory方法得到的ControllerFactory僅僅用于獲取會話狀態行為模式,而MvcHandler真正將它用于創建Controller。如下的代碼片段基本上體現了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

            {

                //調用BeginExecute/EndExecute方法以異步的方式執行Controller

            }

            finally

            {

                controllerFactory.ReleaseController(controller);

            }

        }

        else

        {

            try

            {

                //調用Execute方法以異步的方式執行Controller

            }

            finally

            {

                controllerFactory.ReleaseController(controller);

            }

        }

    }

}

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

以上是“Controller激活與URL路由的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女