mvc5 源码解析 mvchandler的执行2-2
Posted nnyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mvc5 源码解析 mvchandler的执行2-2相关的知识,希望对你有一定的参考价值。
我们从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的主要内容,如果未能解决你的问题,请参考以下文章
net mvc5 源码解析1:UrlRoutingModule
Apache IoTDB源码解析(0.11.2版本):Session执行executeQueryStatement的源码解析