1
private
void
ProcessRequestInternal(HttpWorkerRequest wr)
2 {
3 HttpContext context;
4 try
5 {
6 context = new HttpContext(wr, false ); // 1. 创建HttpContext实例
7 }
8 catch
9 {
10 wr.SendStatus( 400 , " Bad Request " );
11 wr.SendKnownResponseHeader( 12 , " text/html; charset=utf-8 " );
12 byte [] bytes = Encoding.ASCII.GetBytes( " <html><body>Bad Request</body></html> " );
13 wr.SendResponseFromMemory(bytes, bytes.Length);
14 wr.FlushResponse( true );
15 wr.EndOfRequest();
16 return ;
17 }
18 wr.SetEndOfSendNotification( this ._asyncEndOfSendCallback, context);
19 Interlocked.Increment( ref this ._activeRequestCount);
20 HostingEnvironment.IncrementBusyCount();
21 try
22 {
23 try
24 {
25 this .EnsureFirstRequestInit(context); // 2.在EnsureFirstRequestInit中通过调用System.Web.HttpRuntime.FirstRequestInit进行一些初始化工作,比如:将Web.Config配置读到到RuntimeConfig中,从bin目录中装载所有dll文件。
26
27 }
28 catch
29 {
30 if ( ! context.Request.IsDebuggingRequest)
31 {
32 throw ;
33 }
34 }
35 context.Response.InitResponseWriter();
36 IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);
37 // 3.通过调用HttpApplicationFactory.GetApplicationInstance创建HttpApplication实例。
38 if (applicationInstance == null )
39 {
40 throw new HttpException(SR.GetString( " Unable_create_app_object " ));
41 }
42 if (EtwTrace.IsTraceEnabled( 5 , 1 ))
43 {
44 EtwTrace.Trace(EtwTraceType.ETW_TYPE_START_HANDLER, context.WorkerRequest, applicationInstance.GetType().FullName, " Start " );
45 }
46 if (applicationInstance is IHttpAsyncHandler)
47 {
48 IHttpAsyncHandler handler2 = (IHttpAsyncHandler) applicationInstance;
49 context.AsyncAppHandler = handler2;
50 handler2.BeginProcessRequest(context, this ._handlerCompletionCallback, context); // 4.调用HttpApplication实例的BeginProcessRequest异步处理请求。
51 上面所讲的_execSteps中所发生的许多事情,都是在HttpRuntime调用HttpApplication BeginProcessRequest之后,在BeginProcessRequest中调用ResumeSteps后执行的
52 }
53 else
54 {
55 applicationInstance.ProcessRequest(context);
56 this .FinishRequest(context.WorkerRequest, context, null );
57 }
58 }
59 catch (Exception exception)
60 {
61 context.Response.InitResponseWriter();
62 this .FinishRequest(wr, context, exception);
63 }
64 }
65
66
67 internal static IHttpHandler GetApplicationInstance(HttpContext context)
68 {
69 if (_customApplication != null )
70 {
71 return _customApplication;
72 }
73 if (context.Request.IsDebuggingRequest)
74 {
75 return new HttpDebugHandler();
76 }
77 _theApplicationFactory.EnsureInited();
78 _theApplicationFactory.EnsureAppStartCalled(context);
79 return _theApplicationFactory.GetNormalApplicationInstance(context);
80 }
81
82 1 ) HttpApplicationFactory._theApplicationFactory.EnsureInited();
83 该方法检查HttpApplicationFactory是否被初始化,如果没有,就通过HttpApplicationFactory.Init()进行初始化。
84 在Init()中,先获取global.asax文件的完整路径,然后调用CompileApplication()对global.asax进行编译。
85 那编译是如何进行的呢?
86 编译的工作由BuildManager完成的。BuildManager先得到GlobalAsaxType(也就是HttpApplication),然后调用BuildManager.GetGlobalAsaxBuildResult() = 》GetGlobalAsaxBuildResultInternal() = 》EnsureTopLevelFilesCompiled()进行编译。
87 在EnsureTopLevelFilesCompiled中,先进行CompilationStage.TopLevelFiles编译,对下面三个目录中的文件进行编译:
88 a. CompileResourcesDirectory();
89 编译App_GlobalResources目录。
90 b. CompileWebRefDirectory();
91 编译App_WebReferences目录。
92 c. CompileCodeDirectories();
93 编译App_Code目录。
94
95 接着进行CompilationStage.GlobalAsax 编译,对global.asax进行编译,方法调用情况:CompileGlobalAsax() = 》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp)。
96 在GetGlobalAsaxBuildResult中具体的编译是由ApplicationBuildProvider与BuildProvidersCompiler共同完成的。
97 BuildProvidersCompiler.PerformBuild();进行编译工作。
98 ApplicationBuildProvider.GetBuildResult得到编译的结果。
99 编译成功后,会在C:\WINDOWS\Microsoft.NET\Framework\v2. 0.50727 \Temporary ASP.NET Files\相应的目录中生成类似App_global.asax.mlgx7n2v.dll的dll文件。
100 编译生成的类名为ASP.global_asax,继承自HttpApplication。
101 注:如果Web目录中没有Global.asax文件,就不会编译生成App_global.asax.mlgx7n2v.dll这样的文件。
102
103 2 ) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
104 创建特定的HttpApplication实例,触发ApplicationOnStart事件,执行ASP.global_asax中的Application_Start( object sender, EventArgs e)方法。这里创建的HttpApplication实例在处理完事件后,就被回收。
105
106 3 ) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
107 该 方法创建HttpApplication实例并进行初始化(调用System.Web.HttpApplication. InitInternal()方法)。
108 创建HttpApplication实例是根据实际的_theApplicationType进行创建。如果Web目录中没有global.asa文件,也就是说没有动态编译生成ASP.global_asax类型,那就直接实例化HttpApplication。如果创建了ASP.global_asax类型,那就对ASP.global_asa进行实例化。
109
110
111
112
113 private HttpApplication GetNormalApplicationInstance(HttpContext context)
114 {
115 HttpApplication application = null ;
116 lock ( this ._freeList)
117 {
118 if ( this ._numFreeAppInstances > 0 )
119 {
120 application = (HttpApplication) this ._freeList.Pop();
121 this ._numFreeAppInstances -- ;
122 if ( this ._numFreeAppInstances < this ._minFreeAppInstances)
123 {
124 this ._minFreeAppInstances = this ._numFreeAppInstances;
125 }
126 }
127 }
128 if (application == null )
129 {
130 application = (HttpApplication) HttpRuntime.CreateNonPublicInstance( this ._theApplicationType);
131 using ( new ApplicationImpersonationContext())
132 {
133 application.InitInternal(context, this ._state, this ._eventHandlerMethods); // (调用System.Web.HttpApplication. InitInternal()方法)。
134
135 }
136 }
137 return application;
138 }
139
140
141 internal void InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers)
142 {
143 this ._state = state;
144 PerfCounters.IncrementCounter(AppPerfCounter.PIPELINES);
145 try
146 {
147 try
148 {
149 this ._initContext = context;
150 this ._initContext.ApplicationInstance = this ;
151 context.ConfigurationPath = context.Request.ApplicationPathObject;
152 using ( new HttpContextWrapper(context))
153 {
154 if (HttpRuntime.UseIntegratedPipeline)
155 {
156 try
157 {
158 context.HideRequestResponse = true ;
159 this ._hideRequestResponse = true ;
160 this .InitIntegratedModules();
161 goto Label_006B;
162 }
163 finally
164 {
165 context.HideRequestResponse = false ;
166 this ._hideRequestResponse = false ;
167 }
168 }
169 this .InitModules();
170 // 1. InitModules():根据Web.Config的设置,创建相应的HttpModules。
171
172 Label_006B:
173 if (handlers != null )
174 {
175 this .HookupEventHandlersForApplicationAndModules(handlers);
176 // 根据发生的事件,调用HttpApplication实例中相应的事件处理函数。
177
178 }
179 this ._context = context;
180 if (HttpRuntime.UseIntegratedPipeline && ( this ._context != null ))
181 {
182 this ._context.HideRequestResponse = true ;
183 }
184 this ._hideRequestResponse = true ;
185 try
186 {
187 this .Init();
188 }
189 catch (Exception exception)
190 {
191 this .RecordError(exception);
192 }
193 }
194 if (HttpRuntime.UseIntegratedPipeline && ( this ._context != null ))
195 {
196 this ._context.HideRequestResponse = false ;
197 }
198 this ._hideRequestResponse = false ;
199 this ._context = null ;
200 this ._resumeStepsWaitCallback = new WaitCallback( this .ResumeStepsWaitCallback);
201 if (HttpRuntime.UseIntegratedPipeline)
202 {
203 this ._stepManager = new PipelineStepManager( this );
204 }
205 else
206 {
207 this ._stepManager = new ApplicationStepManager( this );
208 }
209 this ._stepManager.BuildSteps( this ._resumeStepsWaitCallback);
210 }
211 finally
212 {
213 this ._initInternalCompleted = true ;
214 context.ConfigurationPath = null ;
215 this ._initContext.ApplicationInstance = null ;
216 this ._initContext = null ;
217 }
218 }
219 catch
220 {
221 throw ;
222 }
223 }
224
225
226 internal override void BuildSteps(WaitCallback stepCallback)
227 {
228 ArrayList steps = new ArrayList();
229 HttpApplication app = base ._application;
230 bool flag = false ;
231 UrlMappingsSection urlMappings = RuntimeConfig.GetConfig().UrlMappings;
232 flag = urlMappings.IsEnabled && (urlMappings.UrlMappings.Count > 0 );
233 steps.Add( new HttpApplication.ValidatePathExecutionStep(app));
234 if (flag)
235 {
236 steps.Add( new HttpApplication.UrlMappingsExecutionStep(app));
237 }
238 app.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, steps);
239 app.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest, steps);
240 app.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthentication, steps);
241 app.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequest, steps);
242 app.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest, steps);
243 app.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest, steps);
244 app.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache, steps);
245 app.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCache, steps);
246 steps.Add( new HttpApplication.MapHandlerExecutionStep(app));
247 app.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandler, steps);
248 app.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState, steps);
249 app.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestState, steps);
250 app.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExecute, steps);
251 steps.Add( new HttpApplication.CallHandlerExecutionStep(app));
252 app.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerExecute, steps);
253 app.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, steps);
254 app.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestState, steps);
255 steps.Add( new HttpApplication.CallFilterExecutionStep(app));
256 app.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache, steps);
257 app.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCache, steps);
258 this ._endRequestStepIndex = steps.Count;
259 app.CreateEventExecutionSteps(HttpApplication.EventEndRequest, steps);
260 steps.Add( new HttpApplication.NoopExecutionStep());
261 this ._execSteps = new HttpApplication.IExecutionStep[steps.Count];
262 steps.CopyTo( this ._execSteps);
263 this ._resumeStepsWaitCallback = stepCallback;
264 }
265
266
267
268
269
270
271
272
273
274
275
2 {
3 HttpContext context;
4 try
5 {
6 context = new HttpContext(wr, false ); // 1. 创建HttpContext实例
7 }
8 catch
9 {
10 wr.SendStatus( 400 , " Bad Request " );
11 wr.SendKnownResponseHeader( 12 , " text/html; charset=utf-8 " );
12 byte [] bytes = Encoding.ASCII.GetBytes( " <html><body>Bad Request</body></html> " );
13 wr.SendResponseFromMemory(bytes, bytes.Length);
14 wr.FlushResponse( true );
15 wr.EndOfRequest();
16 return ;
17 }
18 wr.SetEndOfSendNotification( this ._asyncEndOfSendCallback, context);
19 Interlocked.Increment( ref this ._activeRequestCount);
20 HostingEnvironment.IncrementBusyCount();
21 try
22 {
23 try
24 {
25 this .EnsureFirstRequestInit(context); // 2.在EnsureFirstRequestInit中通过调用System.Web.HttpRuntime.FirstRequestInit进行一些初始化工作,比如:将Web.Config配置读到到RuntimeConfig中,从bin目录中装载所有dll文件。
26
27 }
28 catch
29 {
30 if ( ! context.Request.IsDebuggingRequest)
31 {
32 throw ;
33 }
34 }
35 context.Response.InitResponseWriter();
36 IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);
37 // 3.通过调用HttpApplicationFactory.GetApplicationInstance创建HttpApplication实例。
38 if (applicationInstance == null )
39 {
40 throw new HttpException(SR.GetString( " Unable_create_app_object " ));
41 }
42 if (EtwTrace.IsTraceEnabled( 5 , 1 ))
43 {
44 EtwTrace.Trace(EtwTraceType.ETW_TYPE_START_HANDLER, context.WorkerRequest, applicationInstance.GetType().FullName, " Start " );
45 }
46 if (applicationInstance is IHttpAsyncHandler)
47 {
48 IHttpAsyncHandler handler2 = (IHttpAsyncHandler) applicationInstance;
49 context.AsyncAppHandler = handler2;
50 handler2.BeginProcessRequest(context, this ._handlerCompletionCallback, context); // 4.调用HttpApplication实例的BeginProcessRequest异步处理请求。
51 上面所讲的_execSteps中所发生的许多事情,都是在HttpRuntime调用HttpApplication BeginProcessRequest之后,在BeginProcessRequest中调用ResumeSteps后执行的
52 }
53 else
54 {
55 applicationInstance.ProcessRequest(context);
56 this .FinishRequest(context.WorkerRequest, context, null );
57 }
58 }
59 catch (Exception exception)
60 {
61 context.Response.InitResponseWriter();
62 this .FinishRequest(wr, context, exception);
63 }
64 }
65
66
67 internal static IHttpHandler GetApplicationInstance(HttpContext context)
68 {
69 if (_customApplication != null )
70 {
71 return _customApplication;
72 }
73 if (context.Request.IsDebuggingRequest)
74 {
75 return new HttpDebugHandler();
76 }
77 _theApplicationFactory.EnsureInited();
78 _theApplicationFactory.EnsureAppStartCalled(context);
79 return _theApplicationFactory.GetNormalApplicationInstance(context);
80 }
81
82 1 ) HttpApplicationFactory._theApplicationFactory.EnsureInited();
83 该方法检查HttpApplicationFactory是否被初始化,如果没有,就通过HttpApplicationFactory.Init()进行初始化。
84 在Init()中,先获取global.asax文件的完整路径,然后调用CompileApplication()对global.asax进行编译。
85 那编译是如何进行的呢?
86 编译的工作由BuildManager完成的。BuildManager先得到GlobalAsaxType(也就是HttpApplication),然后调用BuildManager.GetGlobalAsaxBuildResult() = 》GetGlobalAsaxBuildResultInternal() = 》EnsureTopLevelFilesCompiled()进行编译。
87 在EnsureTopLevelFilesCompiled中,先进行CompilationStage.TopLevelFiles编译,对下面三个目录中的文件进行编译:
88 a. CompileResourcesDirectory();
89 编译App_GlobalResources目录。
90 b. CompileWebRefDirectory();
91 编译App_WebReferences目录。
92 c. CompileCodeDirectories();
93 编译App_Code目录。
94
95 接着进行CompilationStage.GlobalAsax 编译,对global.asax进行编译,方法调用情况:CompileGlobalAsax() = 》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp)。
96 在GetGlobalAsaxBuildResult中具体的编译是由ApplicationBuildProvider与BuildProvidersCompiler共同完成的。
97 BuildProvidersCompiler.PerformBuild();进行编译工作。
98 ApplicationBuildProvider.GetBuildResult得到编译的结果。
99 编译成功后,会在C:\WINDOWS\Microsoft.NET\Framework\v2. 0.50727 \Temporary ASP.NET Files\相应的目录中生成类似App_global.asax.mlgx7n2v.dll的dll文件。
100 编译生成的类名为ASP.global_asax,继承自HttpApplication。
101 注:如果Web目录中没有Global.asax文件,就不会编译生成App_global.asax.mlgx7n2v.dll这样的文件。
102
103 2 ) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
104 创建特定的HttpApplication实例,触发ApplicationOnStart事件,执行ASP.global_asax中的Application_Start( object sender, EventArgs e)方法。这里创建的HttpApplication实例在处理完事件后,就被回收。
105
106 3 ) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
107 该 方法创建HttpApplication实例并进行初始化(调用System.Web.HttpApplication. InitInternal()方法)。
108 创建HttpApplication实例是根据实际的_theApplicationType进行创建。如果Web目录中没有global.asa文件,也就是说没有动态编译生成ASP.global_asax类型,那就直接实例化HttpApplication。如果创建了ASP.global_asax类型,那就对ASP.global_asa进行实例化。
109
110
111
112
113 private HttpApplication GetNormalApplicationInstance(HttpContext context)
114 {
115 HttpApplication application = null ;
116 lock ( this ._freeList)
117 {
118 if ( this ._numFreeAppInstances > 0 )
119 {
120 application = (HttpApplication) this ._freeList.Pop();
121 this ._numFreeAppInstances -- ;
122 if ( this ._numFreeAppInstances < this ._minFreeAppInstances)
123 {
124 this ._minFreeAppInstances = this ._numFreeAppInstances;
125 }
126 }
127 }
128 if (application == null )
129 {
130 application = (HttpApplication) HttpRuntime.CreateNonPublicInstance( this ._theApplicationType);
131 using ( new ApplicationImpersonationContext())
132 {
133 application.InitInternal(context, this ._state, this ._eventHandlerMethods); // (调用System.Web.HttpApplication. InitInternal()方法)。
134
135 }
136 }
137 return application;
138 }
139
140
141 internal void InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers)
142 {
143 this ._state = state;
144 PerfCounters.IncrementCounter(AppPerfCounter.PIPELINES);
145 try
146 {
147 try
148 {
149 this ._initContext = context;
150 this ._initContext.ApplicationInstance = this ;
151 context.ConfigurationPath = context.Request.ApplicationPathObject;
152 using ( new HttpContextWrapper(context))
153 {
154 if (HttpRuntime.UseIntegratedPipeline)
155 {
156 try
157 {
158 context.HideRequestResponse = true ;
159 this ._hideRequestResponse = true ;
160 this .InitIntegratedModules();
161 goto Label_006B;
162 }
163 finally
164 {
165 context.HideRequestResponse = false ;
166 this ._hideRequestResponse = false ;
167 }
168 }
169 this .InitModules();
170 // 1. InitModules():根据Web.Config的设置,创建相应的HttpModules。
171
172 Label_006B:
173 if (handlers != null )
174 {
175 this .HookupEventHandlersForApplicationAndModules(handlers);
176 // 根据发生的事件,调用HttpApplication实例中相应的事件处理函数。
177
178 }
179 this ._context = context;
180 if (HttpRuntime.UseIntegratedPipeline && ( this ._context != null ))
181 {
182 this ._context.HideRequestResponse = true ;
183 }
184 this ._hideRequestResponse = true ;
185 try
186 {
187 this .Init();
188 }
189 catch (Exception exception)
190 {
191 this .RecordError(exception);
192 }
193 }
194 if (HttpRuntime.UseIntegratedPipeline && ( this ._context != null ))
195 {
196 this ._context.HideRequestResponse = false ;
197 }
198 this ._hideRequestResponse = false ;
199 this ._context = null ;
200 this ._resumeStepsWaitCallback = new WaitCallback( this .ResumeStepsWaitCallback);
201 if (HttpRuntime.UseIntegratedPipeline)
202 {
203 this ._stepManager = new PipelineStepManager( this );
204 }
205 else
206 {
207 this ._stepManager = new ApplicationStepManager( this );
208 }
209 this ._stepManager.BuildSteps( this ._resumeStepsWaitCallback);
210 }
211 finally
212 {
213 this ._initInternalCompleted = true ;
214 context.ConfigurationPath = null ;
215 this ._initContext.ApplicationInstance = null ;
216 this ._initContext = null ;
217 }
218 }
219 catch
220 {
221 throw ;
222 }
223 }
224
225
226 internal override void BuildSteps(WaitCallback stepCallback)
227 {
228 ArrayList steps = new ArrayList();
229 HttpApplication app = base ._application;
230 bool flag = false ;
231 UrlMappingsSection urlMappings = RuntimeConfig.GetConfig().UrlMappings;
232 flag = urlMappings.IsEnabled && (urlMappings.UrlMappings.Count > 0 );
233 steps.Add( new HttpApplication.ValidatePathExecutionStep(app));
234 if (flag)
235 {
236 steps.Add( new HttpApplication.UrlMappingsExecutionStep(app));
237 }
238 app.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, steps);
239 app.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest, steps);
240 app.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthentication, steps);
241 app.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequest, steps);
242 app.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest, steps);
243 app.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest, steps);
244 app.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache, steps);
245 app.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCache, steps);
246 steps.Add( new HttpApplication.MapHandlerExecutionStep(app));
247 app.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandler, steps);
248 app.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState, steps);
249 app.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestState, steps);
250 app.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExecute, steps);
251 steps.Add( new HttpApplication.CallHandlerExecutionStep(app));
252 app.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerExecute, steps);
253 app.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, steps);
254 app.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestState, steps);
255 steps.Add( new HttpApplication.CallFilterExecutionStep(app));
256 app.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache, steps);
257 app.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCache, steps);
258 this ._endRequestStepIndex = steps.Count;
259 app.CreateEventExecutionSteps(HttpApplication.EventEndRequest, steps);
260 steps.Add( new HttpApplication.NoopExecutionStep());
261 this ._execSteps = new HttpApplication.IExecutionStep[steps.Count];
262 steps.CopyTo( this ._execSteps);
263 this ._resumeStepsWaitCallback = stepCallback;
264 }
265
266
267
268
269
270
271
272
273
274
275