HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】(3)
2014-01-14 10:40
459 查看
ASP.NET运行机制
在IIS6图示中我们分析到“ AppManagerAppDomainFactory 的 Create 方法为 Application 创建一个 Application Domain;通过 ISAPIRuntime 的 ProcessRequest 处理 Request,进而将流程进入到 ASP.NET Http Runtime Pipeline。”
下面我们来看一下AppDomain运行过程图示
AppDomain的作用,相信大家都很了解了吧.这里简明扼要的写几点:
一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问(只能使用按引用封送或者按值封送,起到了很好的隔离作用).
AppDomain可以卸载 CLR不支持从AppDomain中卸载一个程序集的能力,但可以告诉CLR卸载一个AppDomain,从而达到卸载当前包含在该AppDomain内的所有程序集.
AppDomain 可以单独保护 当宿主加载一些代码之后,可以保证这些代码不会被破坏(或读取)宿主本身使用的一些重要的数据结构.
AppDomain可以单独配置 设置主要影响CLR在AppDomain中加载程序集的方式,涉及搜索路径、版本绑定重定向、卷影复制及加载器的优化。
由以上几点可以看出AppDomain确保了Windows系统及其中运行的应用程序的健壮性。AppDomain提供了保护、配置和终止其中每一个应用程序所需的隔离性。
再来看下ProcessRequest的过程
简单分析一下上图
ProcessRequest(HttpWorkerRequest wr)中判断wr是否为null,然后判断管线是否完整,再调用ProcessRequestNoDemand(wr)方法,
并判断当前RequestQueue 是否为null,接着计算等待时间并更新管线数 CalculateWaitTimeAndUpdatePerfCounter(wr);
重置wr开始时间wr.ResetStartTime();调用ProcessRequestNow(wr)方法,并调用ProcessRequestInternal(wr)方法
继续图例
ProcessRequestInternal方法如下:
再看下GetApplicationInstance(context) 实例化Application的方法
最后调用的GetNormalApplicationInstance方法中对当前空闲的application数目进行判断,调用
application.InitInternal(context, this._state, this._eventHandlerMethods)方法,
this.InitModules()初始化所有的Modules,包含用户自定义的HttpModules
this._stepManager.BuildSteps(this._resumeStepsWaitCallback);//管道事件序列
贴一下源码:
到这里想必能够使大家对ASP.NET管道机制能够有一个简单的回顾.当然还有很多地方没有详细分析。
再来总结一下IIS运行过程及ASP.NET管道机制:
Request→ (Internet ) HTTP.sys 监听 → WAS (IIS6 web Admin Service /IIS7 (Windows Activation Service) 接收请求
→(传入)Application Pool's → w3wp.exe(检查URL后缀)
→(加载)ISAPI扩展[aspnet_isapi.dll] → 注册映射
构造HttpRuntime类 →ProcessRequest方法
HttpContext实例产生(Request,Response,Session and so on…)
HttpRuntime 调用 HttpApplicationFactory加载HttpApplication对象
穿越HttpModule到达HttpHandler
简单用140个字符(即一条微博的字数
)概括:
Request→ (Internet ) HTTP.sys →(WAS)→Application Pool's → w3wp.exe→ISAPI→ Map→ (Pipeline)HttpWorkerRequest→AppDomain→HttpRuntime→ProcessRequest()→ HttpContext(Request,Response)→ HttpRuntime→HttpApplicationFactory→HttpApplication→ HttpModule→HttpHandler→EndRequest
以上为个人学习摘要,如有错误,欢迎指正!!
补充
1:刚刚看到dudu发的一个闪存,里面提到了Application pool 与 AppDomain 的区别 来自stackoverflow,希望对大家有所帮助.
2:WAS缩写在IIS6中的指的是(Web Admin Service),在IIS7中指的是(Windows Activation Service) 缩写一样.这个在写文章的时候注意到过,但是没有深入考虑. 理解不是很到位. 暂不妄下断言. 欢迎斧正!! :-)
参考资料:
/article/4779572.html
http://msdn.microsoft.com/en-us/library/system.web.httpapplication(v=vs.80).aspx
/article/5159763.html
后续
由于一些个人原因,放弃了原本在无锡相对安逸的工作,踏上了北漂之路,也希望在大环境下能够得到更多的锻炼与打磨.
当然,最近也正在找工作,如果您有合适的职位,烦请介绍一下,感谢之至!!
如果你觉得本文对您有所帮助,请点击一下推荐,感谢您的阅读!!
原文链接:http://www.cnblogs.com/wenthink/archive/2013/05/06/3058989.html
【编辑推荐】
不改代码就能优化ASP.NET网站性能的方法
当ASP.NET MVC邂逅jQuery.Ajax提交数组
如何在ASP.NET应用程序中初始化
ASP.NET WebForm也可以这样用Ajax
Asp.Net页面生命周期
在IIS6图示中我们分析到“ AppManagerAppDomainFactory 的 Create 方法为 Application 创建一个 Application Domain;通过 ISAPIRuntime 的 ProcessRequest 处理 Request,进而将流程进入到 ASP.NET Http Runtime Pipeline。”
下面我们来看一下AppDomain运行过程图示
AppDomain的作用,相信大家都很了解了吧.这里简明扼要的写几点:
一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问(只能使用按引用封送或者按值封送,起到了很好的隔离作用).
AppDomain可以卸载 CLR不支持从AppDomain中卸载一个程序集的能力,但可以告诉CLR卸载一个AppDomain,从而达到卸载当前包含在该AppDomain内的所有程序集.
AppDomain 可以单独保护 当宿主加载一些代码之后,可以保证这些代码不会被破坏(或读取)宿主本身使用的一些重要的数据结构.
AppDomain可以单独配置 设置主要影响CLR在AppDomain中加载程序集的方式,涉及搜索路径、版本绑定重定向、卷影复制及加载器的优化。
由以上几点可以看出AppDomain确保了Windows系统及其中运行的应用程序的健壮性。AppDomain提供了保护、配置和终止其中每一个应用程序所需的隔离性。
再来看下ProcessRequest的过程
简单分析一下上图
ProcessRequest(HttpWorkerRequest wr)中判断wr是否为null,然后判断管线是否完整,再调用ProcessRequestNoDemand(wr)方法,
并判断当前RequestQueue 是否为null,接着计算等待时间并更新管线数 CalculateWaitTimeAndUpdatePerfCounter(wr);
重置wr开始时间wr.ResetStartTime();调用ProcessRequestNow(wr)方法,并调用ProcessRequestInternal(wr)方法
继续图例
ProcessRequestInternal方法如下:
private void ProcessRequestInternal(HttpWorkerRequest wr) { HttpContext context; try { context = new HttpContext(wr, false);//由HttpWorkerRequest生成HttpContext } catch { //常见的400错误,就是在这里捕捉到滴 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); //得到HttpApplication if (applicationInstance == null) { throw new HttpException(System.Web.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);//届时 HttpApplication处理请求 } else { applicationInstance.ProcessRequest(context); this.FinishRequest(context.WorkerRequest, context, null); } } catch (Exception exception) { context.Response.InitResponseWriter(); this.FinishRequest(wr, context, exception); } }
再看下GetApplicationInstance(context) 实例化Application的方法
View Code 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); }
最后调用的GetNormalApplicationInstance方法中对当前空闲的application数目进行判断,调用
application.InitInternal(context, this._state, this._eventHandlerMethods)方法,
this.InitModules()初始化所有的Modules,包含用户自定义的HttpModules
this._stepManager.BuildSteps(this._resumeStepsWaitCallback);//管道事件序列
贴一下源码:
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.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; }
到这里想必能够使大家对ASP.NET管道机制能够有一个简单的回顾.当然还有很多地方没有详细分析。
再来总结一下IIS运行过程及ASP.NET管道机制:
Request→ (Internet ) HTTP.sys 监听 → WAS (IIS6 web Admin Service /IIS7 (Windows Activation Service) 接收请求
→(传入)Application Pool's → w3wp.exe(检查URL后缀)
→(加载)ISAPI扩展[aspnet_isapi.dll] → 注册映射
构造HttpRuntime类 →ProcessRequest方法
HttpContext实例产生(Request,Response,Session and so on…)
HttpRuntime 调用 HttpApplicationFactory加载HttpApplication对象
穿越HttpModule到达HttpHandler
简单用140个字符(即一条微博的字数
)概括:
Request→ (Internet ) HTTP.sys →(WAS)→Application Pool's → w3wp.exe→ISAPI→ Map→ (Pipeline)HttpWorkerRequest→AppDomain→HttpRuntime→ProcessRequest()→ HttpContext(Request,Response)→ HttpRuntime→HttpApplicationFactory→HttpApplication→ HttpModule→HttpHandler→EndRequest
以上为个人学习摘要,如有错误,欢迎指正!!
补充
1:刚刚看到dudu发的一个闪存,里面提到了Application pool 与 AppDomain 的区别 来自stackoverflow,希望对大家有所帮助.
2:WAS缩写在IIS6中的指的是(Web Admin Service),在IIS7中指的是(Windows Activation Service) 缩写一样.这个在写文章的时候注意到过,但是没有深入考虑. 理解不是很到位. 暂不妄下断言. 欢迎斧正!! :-)
参考资料:
/article/4779572.html
http://msdn.microsoft.com/en-us/library/system.web.httpapplication(v=vs.80).aspx
/article/5159763.html
后续
由于一些个人原因,放弃了原本在无锡相对安逸的工作,踏上了北漂之路,也希望在大环境下能够得到更多的锻炼与打磨.
当然,最近也正在找工作,如果您有合适的职位,烦请介绍一下,感谢之至!!
如果你觉得本文对您有所帮助,请点击一下推荐,感谢您的阅读!!
原文链接:http://www.cnblogs.com/wenthink/archive/2013/05/06/3058989.html
【编辑推荐】
不改代码就能优化ASP.NET网站性能的方法
当ASP.NET MVC邂逅jQuery.Ajax提交数组
如何在ASP.NET应用程序中初始化
ASP.NET WebForm也可以这样用Ajax
Asp.Net页面生命周期
相关文章推荐
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- 瀚海拾贝(一)HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- 瀚海拾贝(一)HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- 【转】HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】(2)
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】(1)
- 【转】图解 HTTP协议/IIS 原理及ASP.NET运行机制浅析
- HTTP协议/IIS 原理及ASP.NET运行机制浅析
- HTTP协议/IIS 原理及ASP.NET运行机制浅析 转载
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
- HTTP协议/IIS 原理及ASP.NET运行机制浅析
- HTTP协议/IIS 原理及ASP.NET运行机制浅析
- HTTP协议/IIS 原理及ASP.NET运行机制浅析
- Asp.net WebPages框架运行原理浅析(转)
- 转文:ASP.NET运行机制原理
- ASP.NET的运行原理与运行机制
- .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析