在了解Asp.net请求处理流程的过程中,个人认为有必要从源代码的角度来了解asp.net管道是怎么实现的。 
在此之前大家有必要了解一些asp.net请求流程的基本东东,如ASP.NET 请求处理流程、Asp.net管道、ASP.NET管线与应用程序生命周期 
我们大家都知道HttpRuntime主要的方法是 
public static void ProcessRequest(HttpWorkerRequest wr)
复制代码 代码如下:
private void ProcessRequestInternal(HttpWorkerRequest wr) 
{ 
HttpContext context; 
try 
{ 
context = new HttpContext(wr, false); 
} 
catch 
{ 
wr.SendStatus(400, "Bad Request"); 
wr.SendKnownResponseHeader(12, "text/html; charset=utf-8"); 
byte[] bytes = Encoding.ASCII.GetBytes("<html><body>Bad Request</body></html>"); 
wr.SendResponseFromMemory(bytes, bytes.Length); 
wr.FlushResponse(true); 
wr.EndOfRequest(); 
return; 
} 
wr.SetEndOfSendNotification(this._asyncEndOfSendCallback, context); 
Interlocked.Increment(ref this._activeRequestCount); 
HostingEnvironment.IncrementBusyCount(); 
try 
{ 
try 
{ 
this.EnsureFirstRequestInit(context); 
} 
catch 
{ 
if (!context.Request.IsDebuggingRequest) 
{ 
throw; 
} 
} 
context.Response.InitResponseWriter(); 
IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context); 
if (applicationInstance == null) 
{ 
throw new HttpException(SR.GetString("Unable_create_app_object")); 
} 
if (EtwTrace.IsTraceEnabled(5, 1)) 
{ 
EtwTrace.Trace(EtwTraceType.ETW_TYPE_START_HANDLER, context.WorkerRequest, applicationInstance.GetType().FullName, "Start"); 
} 
if (applicationInstance is IHttpAsyncHandler) 
{ 
IHttpAsyncHandler handler2 = (IHttpAsyncHandler) applicationInstance; 
context.AsyncAppHandler = handler2; 
handler2.BeginProcessRequest(context, this._handlerCompletionCallback, context); 
} 
else 
{ 
applicationInstance.ProcessRequest(context); 
this.FinishRequest(context.WorkerRequest, context, null); 
} 
} 
catch (Exception exception) 
{ 
context.Response.InitResponseWriter(); 
this.FinishRequest(wr, context, exception); 
} 
}
我们看到里面有这么一句
IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);用来获取HttpApplication,而HttpApplication实现了IHttpAsyncHandler接口public class HttpApplication : IHttpAsyncHandler, IHttpHandler, IComponent, IDisposable,最后调用application的BeginProcessRequest方法。
HttpApplicationFactory.GetApplicationInstance(context)主要是调用GetNormalApplicationInstance
复制代码 代码如下:
internal static IHttpHandler GetApplicationInstance(HttpContext context) 
{ 
if (_customApplication != null) 
{ 
return _customApplication; 
} 
if (context.Request.IsDebuggingRequest) 
{ 
return new HttpDebugHandler(); 
} 
_theApplicationFactory.EnsureInited(); 
_theApplicationFactory.EnsureAppStartCalled(context); 
return _theApplicationFactory.GetNormalApplicationInstance(context); 
}
复制代码 代码如下:
private HttpApplication GetNormalApplicationInstance(HttpContext context) 
{ 
HttpApplication application = null; 
lock (this._freeList) 
{ 
if (this._numFreeAppInstances > 0) 
{ 
application = (HttpApplication) this._freeList.Pop(); 
this._numFreeAppInstances--; 
if (this._numFreeAppInstances < this._minFreeAppInstances) 
{ 
this._minFreeAppInstances = this._numFreeAppInstances; 
} 
} 
} 
if (application == null) 
{ 
application = (HttpApplication) HttpRuntime.CreateNonPublicInstance(this._theApplicationType); 
using (new ApplicationImpersonationContext()) 
{ 
application.InitInternal(context, this._state, this._eventHandlerMethods); 
} 
} 
return application; 
}
在GetNormalApplicationInstance里面有一个比较关键的方法application.InitInternal(context, this._state, this._eventHandlerMethods);我们猜测它是做Application初始化的工作,包括http管道的初始化。
复制代码 代码如下:
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 Label_006B; 
} 
finally 
{ 
context.HideRequestResponse = false; 
this._hideRequestResponse = false; 
} 
} 
this.InitModules(); 
Label_006B: 
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 exception) 
{ 
this.RecordError(exception); 
} 
} 
if (HttpRuntime.UseIntegratedPipeline && (this._context != null)) 
{ 
this._context.HideRequestResponse = false; 
} 
this._hideRequestResponse = false; 
this._context = null; 
this._resumeStepsWaitCallback = new WaitCallback(this.ResumeStepsWaitCallback); 
if (HttpRuntime.UseIntegratedPipeline) 
{ 
this._stepManager = new PipelineStepManager(this); 
} 
else 
{ 
this._stepManager = new ApplicationStepManager(this); 
} 
this._stepManager.BuildSteps(this._resumeStepsWaitCallback); 
} 
finally 
{ 
this._initInternalCompleted = true; 
context.ConfigurationPath = null; 
this._initContext.ApplicationInstance = null; 
this._initContext = null; 
} 
} 
catch 
{ 
throw; 
} 
}
这个方法关键的代码在于:
复制代码 代码如下:
