internal class CallHandlerExecutionStep : HttpApplication.IExecutionStep 
{ 
// Fields 
private HttpApplication _application; 
private AsyncCallback _completionCallback; 
private IHttpAsyncHandler _handler; 
private bool _sync; 
// Methods 
internal CallHandlerExecutionStep(HttpApplication app) 
{ 
this._application = app; 
this._completionCallback = new AsyncCallback(this.OnAsyncHandlerCompletion); 
} 
private void OnAsyncHandlerCompletion(IAsyncResult ar) 
{ 
if (!ar.CompletedSynchronously) 
{ 
HttpContext context = this._application.Context; 
Exception error = null; 
try 
{ 
try 
{ 
this._handler.EndProcessRequest(ar); 
} 
finally 
{ 
context.Response.GenerateResponseHeadersForHandler(); 
} 
} 
catch (Exception exception2) 
{ 
if ((exception2 is ThreadAbortException) || ((exception2.InnerException != null) && (exception2.InnerException is ThreadAbortException))) 
{ 
this._application.CompleteRequest(); 
} 
else 
{ 
error = exception2; 
} 
} 
if (EtwTrace.IsTraceEnabled(4, 4)) 
{ 
EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_LEAVE, context.WorkerRequest); 
} 
this._handler = null; 
context.SetStartTime(); 
if (HttpRuntime.IsLegacyCas) 
{ 
this.ResumeStepsWithAssert(error); 
} 
else 
{ 
this.ResumeSteps(error); 
} 
} 
} 
private void ResumeSteps(Exception error) 
{ 
this._application.ResumeStepsFromThreadPoolThread(error); 
} 
[PermissionSet(SecurityAction.Assert, Unrestricted=true)] 
private void ResumeStepsWithAssert(Exception error) 
{ 
this.ResumeSteps(error); 
} 
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 workerRequest = context.WorkerRequest as IIS7WorkerRequest; 
if ((workerRequest != null) && workerRequest.IsHandlerExecutionDenied()) 
{ 
this._sync = true; 
HttpException exception = new HttpException(0x193, SR.GetString("Handler_access_denied")); 
exception.SetFormatter(new PageForbiddenErrorFormatter(context.Request.Path, SR.GetString("Handler_access_denied"))); 
throw exception; 
} 
} 
if (handler == null) 
{ 
this._sync = true; 
} 
else if (handler is IHttpAsyncHandler) 
{ 
IHttpAsyncHandler handler2 = (IHttpAsyncHandler) handler; 
this._sync = false; 
this._handler = handler2; 
IAsyncResult result = handler2.BeginProcessRequest(context, this._completionCallback, null); 
if (result.CompletedSynchronously) 
{ 
this._sync = true; 
this._handler = null; 
try 
{ 
handler2.EndProcessRequest(result); 
} 
finally 
{ 
context.Response.GenerateResponseHeadersForHandler(); 
} 
if (EtwTrace.IsTraceEnabled(4, 4)) 
{ 
EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_LEAVE, context.WorkerRequest); 
} 
} 
} 
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); 
} 
context.Response.GenerateResponseHeadersForHandler(); 
} 
} 
} 
// Properties 
bool HttpApplication.IExecutionStep.CompletedSynchronously 
{ 
get 
{ 
return this._sync; 
} 
} 
bool HttpApplication.IExecutionStep.IsCancellable 
{ 
get 
{ 
return !(this._application.Context.Handler is IHttpAsyncHandler); 
} 
} 
}
在代码中我们看到handler2.BeginProcessRequest(context, this._completionCallback, null);。。。handler.ProcessRequest(context);这2句代码是不是很熟悉啊。
在让我们回头看看HttpApplication的BeginProcessRequest方法
复制代码 代码如下:
