常说管道处理模型的20多个事件,顺序执行。这写顺序执行的事件,控制了asp.net的流程
这20几个事件在httpApplication 中。在这个类中,确实可以看到很多事件,他们是怎么串起来的呢?
里面有个ApplicationStepManager类,可以看到这个流程如下。代码还有其他看法。
其实下面的代码是经典模式的,在调用处,容易找出集成模式的代码。
internal class ApplicationStepManager : StepManager { private IExecutionStep[] _execSteps; private WaitCallback _resumeStepsWaitCallback; private int _currentStepIndex; private int _numStepCalls; private int _numSyncStepCalls; private int _endRequestStepIndex; internal ApplicationStepManager(HttpApplication app) : base(app) { } internal override void BuildSteps(WaitCallback stepCallback) { ArrayList arrayList = new ArrayList(); HttpApplication application = base._application; bool flag = false; UrlMappingsSection urlMappings = RuntimeConfig.GetConfig().UrlMappings; flag = (urlMappings.IsEnabled && urlMappings.UrlMappings.Count > 0); arrayList.Add(new ValidateRequestExecutionStep(application)); arrayList.Add(new ValidatePathExecutionStep(application)); if (flag) { arrayList.Add(new 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 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()); arrayList.Add(new CallHandlerExecutionStep(application)); application.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerExecute, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestState, arrayList); arrayList.Add(new CallFilterExecutionStep(application)); application.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache, arrayList); application.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCache, arrayList); this._endRequestStepIndex = arrayList.Count; application.CreateEventExecutionSteps(HttpApplication.EventEndRequest, arrayList); arrayList.Add(new NoopExecutionStep()); this._execSteps = new IExecutionStep[arrayList.Count]; arrayList.CopyTo(this._execSteps); this._resumeStepsWaitCallback = stepCallback; }