asp.net 管道处理模型源码

常说管道处理模型的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;
		}

猜你喜欢

转载自blog.csdn.net/qqqgg/article/details/80309609
今日推荐