码迷,mamicode.com
首页 > Web开发 > 详细

mvc5 源码解析 mvchandler的执行2-2

时间:2019-06-10 21:18:14      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:ace   erb   iat   eve   tde   查看   module   put   conf   

我们从application获取的时候查看stepmanager的实现类

IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(httpContext);
/ System.Web.HttpApplicationFactory
internal static IHttpHandler GetApplicationInstance(HttpContext context)
{
    if (HttpApplicationFactory._customApplication != null)
    {
        return HttpApplicationFactory._customApplication;
    }
    if (context.Request.IsDebuggingRequest)
    {
        return new HttpDebugHandler();
    }
    HttpApplicationFactory._theApplicationFactory.EnsureInited();
    HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
    return HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
}
/ System.Web.HttpApplicationFactory
private HttpApplication GetNormalApplicationInstance(HttpContext context)
{
    HttpApplication httpApplication = null;
    if (!this._freeList.TryTake(out httpApplication))
    {
    //创建application httpApplication
= (HttpApplication)HttpRuntime.CreateNonPublicInstance(this._theApplicationType); using (new ApplicationImpersonationContext()) {
        //初始化application httpApplication.InitInternal(context,
this._state, this._eventHandlerMethods); } } if (AppSettings.UseTaskFriendlySynchronizationContext) { httpApplication.ApplicationInstanceConsumersCounter = new CountdownTask(1); Task arg_8A_0 = httpApplication.ApplicationInstanceConsumersCounter.Task; Action<Task, object> arg_8A_1; if ((arg_8A_1 = HttpApplicationFactory.<>c.<>9__34_0) == null) { arg_8A_1 = (HttpApplicationFactory.<>c.<>9__34_0 = new Action<Task, object>(HttpApplicationFactory.<>c.<>9.<GetNormalApplicationInstance>b__34_0)); } arg_8A_0.ContinueWith(arg_8A_1, httpApplication, TaskContinuationOptions.ExecuteSynchronously); } return httpApplication; }

  

初始化application

// System.Web.HttpApplication
internal void InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers)
{
    this._state = state;
    PerfCounters.IncrementCounter(AppPerfCounter.PIPELINES);
    try
    {
        try
        {
            this._initContext = context;
            this._initContext.ApplicationInstance = this;
            context.ConfigurationPath = context.Request.ApplicationPathObject;
            using (new DisposableHttpContextWrapper(context))
            {
                if (HttpRuntime.UseIntegratedPipeline)
                {
                    try
                    {
                        context.HideRequestResponse = true;
                        this._hideRequestResponse = true;
                        this.InitIntegratedModules();
                        goto IL_6B;
                    }
                    finally
                    {
                        context.HideRequestResponse = false;
                        this._hideRequestResponse = false;
                    }
                }
                this.InitModules();
                IL_6B:
                if (handlers != null)
                {
                    this.HookupEventHandlersForApplicationAndModules(handlers);
                }
                this._context = context;
                if (HttpRuntime.UseIntegratedPipeline && this._context != null)
                {
                    this._context.HideRequestResponse = true;
                }
                this._hideRequestResponse = true;
                try
                {
                    this.Init();
                }
                catch (Exception error)
                {
                    this.RecordError(error);
                }
            }
            if (HttpRuntime.UseIntegratedPipeline && this._context != null)
            {
                this._context.HideRequestResponse = false;
            }
            this._hideRequestResponse = false;
            this._context = null;
            this._resumeStepsWaitCallback = new WaitCallback(this.ResumeStepsWaitCallback);
        //判断是集成模式还是经典模式分别初始化不同的stepmanager
if (HttpRuntime.UseIntegratedPipeline) { this._stepManager = new HttpApplication.PipelineStepManager(this); } else { this._stepManager = new HttpApplication.ApplicationStepManager(this); }
        //创建步骤
this._stepManager.BuildSteps(this._resumeStepsWaitCallback); } finally { this._initInternalCompleted = true; context.ConfigurationPath = null; this._initContext.ApplicationInstance = null; this._initContext = null; } } catch { throw; } }

创建步骤及执行步骤

经典模式PipelineStepManager管道创建步骤

internal override void BuildSteps(WaitCallback stepCallback)
    {
    //加入步骤各个事件 ArrayList arrayList
= new ArrayList(); HttpApplication application = this._application; UrlMappingsSection urlMappings = RuntimeConfig.GetConfig().UrlMappings; bool flag = urlMappings.IsEnabled && urlMappings.UrlMappings.Count > 0; arrayList.Add(new HttpApplication.ValidateRequestExecutionStep(application)); arrayList.Add(new HttpApplication.ValidatePathExecutionStep(application)); if (flag) { arrayList.Add(new HttpApplication.UrlMappingsExecutionStep(application)); } application.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthentication, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequest, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCache, arrayList);
    arrayList.Add(
new HttpApplication.MapHandlerExecutionStep(application)); application.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandler, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestState, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExecute, arrayList); arrayList.Add(application.CreateImplicitAsyncPreloadExecutionStep());
    //加入mvchandler执行的步骤事件 arrayList.Add(
new HttpApplication.CallHandlerExecutionStep(application)); application.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerExecute, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestState, arrayList); arrayList.Add(new HttpApplication.CallFilterExecutionStep(application)); application.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCache, arrayList); this._endRequestStepIndex = arrayList.Count; application.CreateEventExecutionSteps(HttpApplication.EventEndRequest, arrayList); arrayList.Add(new HttpApplication.NoopExecutionStep()); this._execSteps = new HttpApplication.IExecutionStep[arrayList.Count]; arrayList.CopyTo(this._execSteps); this._resumeStepsWaitCallback = stepCallback; }

CallHandlerExecutionStep

void HttpApplication.IExecutionStep.Execute()
    {
        HttpContext context = this._application.Context;
        IHttpHandler handler = context.Handler;
        if (EtwTrace.IsTraceEnabled(4, 4))
        {
            EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_ENTER, context.WorkerRequest);
        }
        if (handler != null && HttpRuntime.UseIntegratedPipeline)
        {
            IIS7WorkerRequest iIS7WorkerRequest = context.WorkerRequest as IIS7WorkerRequest;
            if (iIS7WorkerRequest != null && iIS7WorkerRequest.IsHandlerExecutionDenied())
            {
                this._sync = true;
                HttpException ex = new HttpException(403, SR.GetString("Handler_access_denied"));
                ex.SetFormatter(new PageForbiddenErrorFormatter(context.Request.Path, SR.GetString("Handler_access_denied")));
                throw ex;
            }
        }
        if (handler == null)
        {
            this._sync = true;
            return;
        }
        if (handler is IHttpAsyncHandler)
        {
            IHttpAsyncHandler httpAsyncHandler = (IHttpAsyncHandler)handler;
            this._sync = false;
            this._handler = httpAsyncHandler;
            Func<HttpContext, AsyncCallback, object, IAsyncResult> func = AppVerifier.WrapBeginMethod<HttpContext>(this._application, new Func<HttpContext, AsyncCallback, object, IAsyncResult>(httpAsyncHandler.BeginProcessRequest));
            this._asyncStepCompletionInfo.Reset();
            context.SyncContext.AllowVoidAsyncOperations();
            IAsyncResult asyncResult;
            try
            {
          //执行beginprocessrequest方法                 asyncResult = func(context, this._completionCallback, null);
            }
            catch
            {
                context.SyncContext.ProhibitVoidAsyncOperations();
                throw;
            }
            bool flag;
            bool flag2;
            this._asyncStepCompletionInfo.RegisterBeginUnwound(asyncResult, out flag, out flag2);
            if (flag)
            {
                this._sync = true;
                this._handler = null;
                context.SyncContext.ProhibitVoidAsyncOperations();
                try
                {
                    if (flag2)
                    {
                        httpAsyncHandler.EndProcessRequest(asyncResult);
                    }
                    this._asyncStepCompletionInfo.ReportError();
                }
                finally
                {
                    HttpApplication.CallHandlerExecutionStep.SuppressPostEndRequestIfNecessary(context);
                    context.Response.GenerateResponseHeadersForHandler();
                }
                if (EtwTrace.IsTraceEnabled(4, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_LEAVE, context.WorkerRequest);
                    return;
                }
            }
        }
        else
        {
            this._sync = true;
            context.SyncContext.SetSyncCaller();
            try
            {
                handler.ProcessRequest(context);
            }
            finally
            {
                context.SyncContext.ResetSyncCaller();
                if (EtwTrace.IsTraceEnabled(4, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_LEAVE, context.WorkerRequest);
                }
                HttpApplication.CallHandlerExecutionStep.SuppressPostEndRequestIfNecessary(context);
                context.Response.GenerateResponseHeadersForHandler();
            }
        }
    }

执行步骤

internal override void ResumeSteps(Exception error)
    {
        bool flag = false;
        bool flag2 = true;
        HttpApplication application = this._application;
        CountdownTask applicationInstanceConsumersCounter = application.ApplicationInstanceConsumersCounter;
        HttpContext context = application.Context;
        ThreadContext threadContext = null;
        AspNetSynchronizationContextBase syncContext = context.SyncContext;
        try
        {
            if (applicationInstanceConsumersCounter != null)
            {
                applicationInstanceConsumersCounter.MarkOperationPending();
            }
            using (syncContext.AcquireThreadLock())
            {
                try
                {
                    threadContext = application.OnThreadEnter();
                }
                catch (Exception ex)
                {
                    if (error == null)
                    {
                        error = ex;
                    }
                }
                try
                {
                    try
                    {
                        while (true)
                        {
                            if (syncContext.Error != null)
                            {
                                error = syncContext.Error;
                                syncContext.ClearError();
                            }
                            if (error != null)
                            {
                                application.RecordError(error);
                                error = null;
                            }
                            if (syncContext.PendingCompletion(this._resumeStepsWaitCallback))
                            {
                                goto IL_123;
                            }
                            if (this._currentStepIndex < this._endRequestStepIndex && (context.Error != null || this._requestCompleted))
                            {
                                context.Response.FilterOutput();
                                this._currentStepIndex = this._endRequestStepIndex;
                            }
                            else
                            {
                                this._currentStepIndex++;
                            }
                            if (this._currentStepIndex >= this._execSteps.Length)
                            {
                                break;
                            }
                            this._numStepCalls++;
                            syncContext.Enable();
                  //执行每个事件中的Excute方法 error
= application.ExecuteStep(this._execSteps[this._currentStepIndex], ref flag2); if (!flag2) { goto IL_123; } this._numSyncStepCalls++; } flag = true; IL_123:; } finally { if (flag) { context.RaiseOnRequestCompleted(); } if (threadContext != null) { try { threadContext.DisassociateFromCurrentThread(); } catch { } } } } catch { throw; } } if (flag) { context.RaiseOnPipelineCompleted(); context.Unroot(); application.AsyncResult.Complete(this._numStepCalls == this._numSyncStepCalls, null, null); application.ReleaseAppInstance(); } } finally { if (applicationInstanceConsumersCounter != null) { applicationInstanceConsumersCounter.MarkOperationCompleted(); } } }

 

   集成模式同理

mvc5 源码解析 mvchandler的执行2-2

标签:ace   erb   iat   eve   tde   查看   module   put   conf   

原文地址:https://www.cnblogs.com/NNYang/p/11000164.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!