• asp.net mvc source(1) MvcHandler


    public class MvcHandler : IHttpHandler, IRequiresSessionState {}
    
    public class MvcHttpHandler : UrlRoutingHandler, IRequiresSessionState {}
    
    public class MvcRouteHandler : IRouteHandler {}
     
    ------------------------------------------------------------------------------------------------------
    官方解释
    IHttpHandler:
    定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。
    IRequiresSessionState :
    指定目标 HTTP 处理程序需要对会话状态值具有读写访问权。这是一个标记接口,没有任何方法。
    在自定义 HTTP 处理程序中实现 IRequiresSessionState 接口,以确定处理程序是否需要对会话状态值具有读写访问权。
    如果您的处理程序将访问会话状态值,它必须实现 IRequiresSessionState 接口(不包含任何方法的标记接口)。
    IRouteHandler :
    定义类必须实现才能处理匹配路由模式的请求的协定。 
    UrlRoutingHandler:
    用作使您能够自定义 ASP.NET 路由如何处理请求的类的基类。 
    public abstract class UrlRoutingHandler : IHttpHandler
    
    ------------------------------------------------------------------------------------------------------
     
    Mvc\MvcHandler.cs
    =》(1)

    void IHttpHandler.ProcessRequest(HttpContext httpContext) {
        ProcessRequest(httpContext);
    }

    =>(2)

    protected virtual void ProcessRequest(HttpContext httpContext) {
        HttpContextBase iHttpContext = new HttpContextWrapper(httpContext);////通过httpContext上下文,初始化一个MVC环境中的上下文
        ProcessRequest(iHttpContext);//有点像适配器模式
    }

    =>(3)真正的处理方法

    protected internal virtual void ProcessRequest(HttpContextBase httpContext) {
        AddVersionHeader(httpContext);

        // Get the controller type
        string controllerName = RequestContext.RouteData.GetRequiredString("controller");

        // Instantiate the controller and call Execute
        IControllerFactory factory = ControllerBuilder.GetControllerFactory();
        IController controller = factory.CreateController(RequestContext, controllerName);
        if (controller == null) {
            throw new InvalidOperationException(
                String.Format(
                    CultureInfo.CurrentUICulture,
                    MvcResources.ControllerBuilder_FactoryReturnedNull,
                    factory.GetType(),
                    controllerName));
        }
        try {
            controller.Execute(RequestContext);
        }
        finally {
            factory.ReleaseController(controller);
        }
    }

    ControllerBase.cs

    =>(4)

    #region IController Members
    void IController.Execute(RequestContext requestContext) {
        Execute(requestContext);
    }
    #endregion

    =>(5)

    protected virtual void Execute(RequestContext requestContext) {
        if (requestContext == null) {
            throw new ArgumentNullException("requestContext");
        }

        Initialize(requestContext);
        ExecuteCore();
    }

    =>(6) 初始化上下文,执行交给子类处理

    protected abstract void ExecuteCore();

    protected virtual void Initialize(RequestContext requestContext) {
        ControllerContext = new ControllerContext(requestContext, this);
    }

    Controller.cs

    =>(7)唯一处理,调用Action

    protected override void ExecuteCore() {
         TempData.Load(ControllerContext, TempDataProvider);

         try {
             string actionName = RouteData.GetRequiredString("action");
             if (!ActionInvoker.InvokeAction(ControllerContext, actionName)) {
                 HandleUnknownAction(actionName);
             }
         }
         finally {
             TempData.Save(ControllerContext, TempDataProvider);
         }
    }

    ControllerActionInvoker.cs

    =>(8)条用Action

    public virtual bool InvokeAction(ControllerContext controllerContext, string actionName) {

    }

    Controller.cs

    =>(9)处理未知的Action 抛404错误

    protected virtual void HandleUnknownAction(string actionName) {
        throw new HttpException(404, String.Format(CultureInfo.CurrentUICulture,
            MvcResources.Controller_UnknownAction, actionName, GetType().FullName));
    }

  • 相关阅读:
    带颜色的输出
    排序默写最后一遍
    树形图查找与纯函数默写第二遍
    查找树形结构的某对象
    纯函数&根据id在树形结构中查找
    Docker搭建私有仓库harbor的搭建与使用
    有 react fiber后,为什么不需要 "vue fiber" ?
    前端开发git使用随笔(搭配VSCode使用
    谷歌浏览器打断点调试方法
    地平线5获取Eventlab赛事时发生错误,请稍后再试。
  • 原文地址:https://www.cnblogs.com/chinaniit/p/1517657.html
Copyright © 2020-2023  润新知