zoukankan      html  css  js  c++  java
  • ASP.NET MVC 从IHttp到页面输出

    MVCHandler应该算是MVC真正开始的地方。MVCHandler实现了IHttpHandler接口,ProcessRequest便是方法入口。

    MVCHandler : IHttpHandler
    void IHttpHandler.ProcessRequest(HttpContext httpContext)
    {
        this.ProcessRequest(httpContext);
    }
    
    protected virtual void ProcessRequest(HttpContext httpContext)
    {
        HttpContextBase base2 = new HttpContextWrapper(httpContext);
        this.ProcessRequest(base2);
    }
    
    protected internal virtual void ProcessRequest(HttpContextBase httpContext)
    {
        IController controller;
        IControllerFactory factory;
        this.ProcessRequestInit(httpContext, out controller, out factory);
        try
        {
            controller.Execute(this.RequestContext);
        }
        finally
        {
            factory.ReleaseController(controller);
        }
    }
    Controller : ControllerBase : IController
    void IController.Execute(RequestContext requestContext)  //------>Controller
    {
        this.Execute(requestContext);
    }
    
    protected virtual void Execute(RequestContext requestContext)   //------>ControllerBase
    {
        if (requestContext == null)
        {
            throw new ArgumentNullException("requestContext");
        }
        if (requestContext.HttpContext == null)
        {
            throw new ArgumentException(MvcResources.ControllerBase_CannotExecuteWithNullHttpContext, "requestContext");
        }
        this.VerifyExecuteCalledOnce();
        this.Initialize(requestContext);
        using (ScopeStorage.CreateTransientScope())
        {
            this.ExecuteCore();
        }
    }
    
    protected override void ExecuteCore()   //------>Controller
    {
        this.PossiblyLoadTempData();
        try
        {
            string requiredString = this.RouteData.GetRequiredString("action");
            if (!this.ActionInvoker.InvokeAction(base.ControllerContext, requiredString))   //public IActionInvoker ActionInvoker { get; set; }
            {
                this.HandleUnknownAction(requiredString);
            }
        }
        finally
        {
            this.PossiblySaveTempData();
        }
    }
    ControllerActionInvoker : IActionInvoker
    public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        if (string.IsNullOrEmpty(actionName))
        {
            throw new ArgumentException(MvcResources.Common_NullOrEmpty, "actionName");
        }
        ControllerDescriptor controllerDescriptor = this.GetControllerDescriptor(controllerContext);
        ActionDescriptor actionDescriptor = this.FindAction(controllerContext, controllerDescriptor, actionName);
        if (actionDescriptor == null)
        {
            return false;
        }
        FilterInfo filters = this.GetFilters(controllerContext, actionDescriptor);
        try
        {
            AuthorizationContext context = this.InvokeAuthorizationFilters(controllerContext, filters.AuthorizationFilters, actionDescriptor);
            if (context.Result != null)
            {
                this.InvokeActionResult(controllerContext, context.Result);
            }
            else
            {
                if (controllerContext.Controller.ValidateRequest)
                {
                    ValidateRequest(controllerContext);
                }
                IDictionary<string, object> parameterValues = this.GetParameterValues(controllerContext, actionDescriptor);
                ActionExecutedContext context2 = this.InvokeActionMethodWithFilters(controllerContext, filters.ActionFilters, actionDescriptor, parameterValues);
                this.InvokeActionResultWithFilters(controllerContext, filters.ResultFilters, context2.Result);
            }
        }
        catch (ThreadAbortException)
        {
            throw;
        }
        catch (Exception exception)
        {
            ExceptionContext context3 = this.InvokeExceptionFilters(controllerContext, filters.ExceptionFilters, exception);
            if (!context3.ExceptionHandled)
            {
                throw;
            }
            this.InvokeActionResult(controllerContext, context3.Result);
        }
        return true;
    }
    
    protected virtual void InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
    {
        actionResult.ExecuteResult(controllerContext);
    }
    ActionResult
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (string.IsNullOrEmpty(this.ViewName))
        {
            this.ViewName = context.RouteData.GetRequiredString("action");
        }
        ViewEngineResult result = null;
        if (this.View == null)
        {
            result = this.FindView(context);   //ViewEngineResult
            this.View = result.View;    //IView接口    
        }
        TextWriter output = context.HttpContext.Response.Output;
        ViewContext viewContext = new ViewContext(context, this.View, this.ViewData, this.TempData, output);
        this.View.Render(viewContext, output);
        if (result != null)
        {
            result.ViewEngine.ReleaseView(context, this.View);
        }
    }
  • 相关阅读:
    图片预加载的JS代码
    JavaScript实现漫天飞花及文字滚动特效的代码
    判断远程图片是否存在的JavaScript代码
    dos批处理命令详解
    内存虚拟盘软件XMSDSK的使用
    医学论坛(收集)
    velocity
    java开源项目 源代码
    开放源代码的全文检索引擎Lucene
    批处理命令大全
  • 原文地址:https://www.cnblogs.com/answercard/p/3294196.html
Copyright © 2011-2022 走看看