手机版

asp.net运行原理详解

时间:2021-10-10 来源:互联网 编辑:宝哥软件园 浏览:

主要类:系统。网络时间系统。工厂系统。应用系统。编译。构建管理系统。编译系统。编译系统。网页处理工厂请求处理简要流程图:

阅读建议:用反射镜工具边查看ASP。NET 2.0的源代码边阅读。分析:当我们通过浏览器向ASP。NET 2.0网站的一个ASP。网页面发起请求时,在服务器端首先是(同移民检查员移民检查)收到请求,IIS一看是ASP。网页面,心里很开心,因为这个请求不用它处理,交给ASP .NET ISAPI就行了。ASP.NET ISAPI的工作也比较轻松,他的主要任务就是安排aspnet_wp.exe处理请求,并监视aspnet_wp.exe进程的执行情况,如果aspnet_wp.exe进程太累了,不能出色地完成任务,ASP .NET ISAPI就要让他下岗,换一个新的aspnet_wp.exe来处理工作。aspnet_wp.exe的主要任务是将请求交给一系列称为的超文本传送协议管道的托管对象。如果把ASP。NET ISAPI比做销售经理,那aspnet_wp.exe就是生产经理,而超文本传送协议管道就是生产的流水线。负责流水线的小组就是HttpRuntime,生产经理aspnet_wp.exe会将订单(HTTP请求)交给HttpRuntime小组的工作人员处理请求(HttpWorkerRequest wr),HttpRuntime根据内部的分工,最终由processrequest内部(Httpworkerrequest wr)在流水线上进行生产,所以processrequest内部(Httpworkerrequest wr)是我们分析的重点ProcessRequestInternal内部的主要工作是: 1.创建HttpContext实例。 2.对第一次请求进行初始化(确保第一个请求初始化).a)在确保第一个请求初始化中通过调用系统网络。HttpRuntime。第一个请求初始化进行一些初始化工作,比如:将网络。配置配置读到到RuntimeConfig中,从容器目录中装载所有dll文件。 3.创建HttpWriter实例。 4.通过调用http应用工厂.GetApplicationInstance创建超文本传送协议(Hyper Text Transport Protocol的缩写)应用程序实例。在http应用工厂.GetApplicationInstance中有三个关键方法:HttpApplicationFactory ._应用工厂EnsureInited();http应用工厂._应用工厂EnsureAppStartCalled(上下文);http应用工厂._应用工厂GetNormalApplicationInstance(上下文);下面我们对这三个方法逐个进行分析:1) HttpApplicationFactory ._应用工厂EnsureInited();该方法检查超文本传送协议(Hyper Text Transport Protocol的缩写)应用工厂是否被初始化,如果没有,就通过http应用工厂.Init()进行初始化。在Init()中,先获取global.asax文件的完整路径,然后调用CompileApplication()对global.asax进行编译。那编译是如何进行的呢?编译的工作由BuildManager完成的BuildManager。先得到GlobalAsaxType(也就是HttpApplication),然后调用BuildManager .getglobalsxbuildresult()=】getglobalsxbuildresultinternal()=】ensuretoplevelfilecompiled()进行编译。在EnsureTopLevelFilesCompiled已编译已编译中,先进行编译阶段.顶级文件编译,对下面三个目录中的文件进行编译:a . CompileResourcesDirectory();编译App_GlobalResources目录b . CompileWebRefDirectory();编译App_WebReferences目录c. CompileCodeDirectories编译应用程序代码目录。接着进行编译阶段.GlobalAsax编译,对global.asax进行编译,方法调用情况:CompileGlobalAsax()=】applicationBuildProvider .getglobalasxbuildresult(构建管理器.IsPrecompiledApp)。在GetGlobalAsaxBuildResult中具体的编译是由ApplicationBuildProvider与BuildProvidersCompiler编译器编译器共同完成的BuildProvidersCompiler编译器编译器performBuild();进行编译工作ApplicationBuildProvider。GetBuildResult得到编译的结果。编译成功后,会在C: \ WINDOWS \微软。NET \框架\ v 2。0 .50727 \临时ASP。网文件\相应的目录中生成类似App_global.asax.mlgx7n2v.dll的dll文件。编译生成的类名为ASP.global_asax,继承自超文本传送协议(Hyper Text Transport Protocol的缩写)应用程序。注:如果网目录中没有Global.asax文件,就不会编译生成App_global.asax.mlgx7n2v.dll这样的文件2) HttpApplicationFactory ._应用工厂EnsureAppStartCalled(上下文);创建特定的超文本传送协议(Hyper Text Transport Protocol的缩写)应用程序实例,触发ApplicationOnStart事件,执行ASP.global_asax中的应用程序启动(对象发送方,事件参数e)方法。

此处创建的HttpApplication实例在事件处理后被回收。3) HttpApplicationFactory。_应用工厂。GetNormalApplicationInstance(上下文);方法创建一个HttpApplication实例并初始化它(调用系统。web . httpapplication . initial()方法)。http应用程序实例是根据实际的应用程序类型创建的。如果Web目录中没有global.asa文件,也就是ASP.global_asax类型没有动态编译,那么直接实例化HttpApplication。如果创建了ASP.global_asax类型,则实例化ASP.global_asa。创建Http应用程序实例后,将调用实例的initial方法。InitInternal方法也是我们的关键分析方法,其主要功能如下:1 .InitModules():根据Web的设置。配置,创建相应的HttpModules。2.应用程序和模块的HookupEventHandlers:根据事件,调用HttpApplication实例中对应的事件处理程序。3.创建许多实现IExecutionStep接口的类的实例,将它们添加到当前HttpApplication实例的_execSteps中,等待回调执行。从这里我们可以看到,HttpApplication以异步方式处理请求,大量的请求处理工作被放入_ execStep中,等待回调时执行。_execStep中的主要处理任务如下:1)对请求的路径进行安全检查,禁止非法路径访问(ValidatePathExecutionStep)。2)如果设置了UrlMappings,则重写路径(urlmappings executionstep)。3)执行事件处理功能,如BeginRequest、AuthenticateRequest等。4)获取处理当前请求的HttpHandler,其中也执行ASP.NET页面的运行时编译。处理是通过调用系统来完成的。web . http application . maphttphandler方法。在MapHttpHandler中,首先根据访问的地址,从web.config中获取实现IHttpHandlerFactory的对应类型.对于ASP.NET页面,默认为页面汉德工厂。然后创建一个PageHanlderFactory的实例,调用GetHandlerHelper,并在gethandlehlper中调用build manager . createinstancefromvirtulpath来编译和创建当前请求的ASP.NET页面的实例(如果已经编译,直接从缓存中加载)。CreateInstanceFromVirtualPath将编译任务交给了BuildManager。在几次方法调用后,CompileWebFile()结束。CompileWebFile从web.config获取相应的BuildProvider。aspx文件,对应的BuildProvider是PageBuildProvider。这里不进一步分析PageBuildProvider如何编译页面。如果你感兴趣,可以进一步学习ASP.NET 2.0的源代码。5)调用相应的HttpHandler。ProcessRequest方法来处理请求(如果是异步的,则调用BeginProcessReques)。(CallHandlerExecutionStep) 6)将响应内容写入过滤器。(CallFilterExecutionStep) 5。调用HttpApplication实例的BeginProcessRequest异步处理该请求。上面提到的在_execSteps中发生的许多事情都是在httpRuntime调用Http应用程序beginprocessrequest之后和BeginProcessRequest调用ResumeSteps之后执行的。ASP.NET 2.0运行时是ASP.NET 2.0非常复杂、难以理解和重要的一部分。对ASP.NET 2.0运行时源代码的研究将有助于我们加深对ASP.NET 2.0原理的理解,这将有助于我们开发ASP.NET 2.0应用。这篇文章是我第一次学习ASP.NET 2.0的时候写的,为了帮助我更好的理解ASP.NET 2.0。欢迎对文章内容提出批评和建议。

版权声明:asp.net运行原理详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。