if (HttpRuntime.UseIntegratedPipeline) 
{ 
this._stepManager = new PipelineStepManager(this); 
} 
else 
{ 
this._stepManager = new ApplicationStepManager(this); 
} 
this._stepManager.BuildSteps(this._resumeStepsWaitCallback); 
我想大家看到这里就会明白为什么IIS7会有集成模式和经典模式了吧。可能大家不怎么重视此代码,让我们来看看经典模式的ApplicationStepManager
复制代码 代码如下:
internal class ApplicationStepManager : HttpApplication.StepManager 
{ 
// Fields 
private int _currentStepIndex; 
private int _endRequestStepIndex; 
private HttpApplication.IExecutionStep[] _execSteps; 
private int _numStepCalls; 
private int _numSyncStepCalls; 
private WaitCallback _resumeStepsWaitCallback; 
// Methods 
internal ApplicationStepManager(HttpApplication app) : base(app) 
{ 
} 
internal override void BuildSteps(WaitCallback stepCallback) 
{ 
ArrayList steps = new ArrayList(); 
HttpApplication app = base._application; 
bool flag = false; 
UrlMappingsSection urlMappings = RuntimeConfig.GetConfig().UrlMappings; 
flag = urlMappings.IsEnabled && (urlMappings.UrlMappings.Count > 0); 
steps.Add(new HttpApplication.ValidateRequestExecutionStep(app)); 
steps.Add(new HttpApplication.ValidatePathExecutionStep(app)); 
if (flag) 
{ 
steps.Add(new HttpApplication.UrlMappingsExecutionStep(app)); 
} 
app.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthentication, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequest, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCache, steps); 
steps.Add(new HttpApplication.MapHandlerExecutionStep(app)); 
app.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandler, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestState, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExecute, steps); 
steps.Add(new HttpApplication.CallHandlerExecutionStep(app)); 
app.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerExecute, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestState, steps); 
steps.Add(new HttpApplication.CallFilterExecutionStep(app)); 
app.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache, steps); 
app.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCache, steps); 
this._endRequestStepIndex = steps.Count; 
app.CreateEventExecutionSteps(HttpApplication.EventEndRequest, steps); 
steps.Add(new HttpApplication.NoopExecutionStep()); 
this._execSteps = new HttpApplication.IExecutionStep[steps.Count]; 
steps.CopyTo(this._execSteps); 
this._resumeStepsWaitCallback = stepCallback; 
} 
internal override void InitRequest() 
{ 
this._currentStepIndex = -1; 
this._numStepCalls = 0; 
this._numSyncStepCalls = 0; 
base._requestCompleted = false; 
} 
[DebuggerStepperBoundary] 
internal override void ResumeSteps(Exception error) 
{ 
bool flag = false; 
bool completedSynchronously = true; 
HttpApplication application = base._application; 
HttpContext context = application.Context; 
HttpApplication.ThreadContext context2 = null; 
AspNetSynchronizationContext syncContext = context.SyncContext; 
lock (base._application) 
{ 
try 
{ 
context2 = application.OnThreadEnter(); 
} 
catch (Exception exception) 
{ 
if (error == null) 
{ 
error = exception; 
} 
} 
try 
{ 
try 
{ 
Label_0045: 
if (syncContext.Error != null) 
{ 
error = syncContext.Error; 
syncContext.ClearError(); 
} 
if (error != null) 
{ 
application.RecordError(error); 
error = null; 
} 
if (syncContext.PendingOperationsCount > 0) 
{ 
syncContext.SetLastCompletionWorkItem(this._resumeStepsWaitCallback); 
} 
else 
{ 
if ((this._currentStepIndex < this._endRequestStepIndex) && ((context.Error != null) || base._requestCompleted)) 
{ 
context.Response.FilterOutput(); 
this._currentStepIndex = this._endRequestStepIndex; 
} 
else 
{ 
this._currentStepIndex++; 
} 
if (this._currentStepIndex >= this._execSteps.Length) 
{ 
flag = true; 
} 
else 
{ 
this._numStepCalls++; 
context.SyncContext.Enable(); 
error = application.ExecuteStep(this._execSteps[this._currentStepIndex], ref completedSynchronously); 
if (completedSynchronously) 
{ 
this._numSyncStepCalls++; 
goto Label_0045; 
} 
} 
} 
} 
finally 
{ 
if (context2 != null) 
{ 
try 
{ 
context2.Leave(); 
} 
catch 
{ 
} 
} 
} 
} 
catch 
{ 
throw; 
} 
} 
if (flag) 
{ 
context.Unroot(); 
application.AsyncResult.Complete(this._numStepCalls == this._numSyncStepCalls, null, null); 
application.ReleaseAppInstance(); 
} 
} 
}
说简单一点这个类中的internal override void BuildSteps(WaitCallback stepCallback)方法就是为我们注册那19个管道事件, internal override void ResumeSteps(Exception error)就是依次执行此管道事件,而 steps.Add(new HttpApplication.MapHandlerExecutionStep(app));是映射我们的handler
复制代码 代码如下:
