一起谈.NET技术,关于ASP.NET与CLR相互关系的一些总结

  CLR(COM服务器)

  CLR作为一个COM服务器实现在MSCorWks.dll文件中。安装.NET Framework时,表示CLR的COM服务器被注册到Windows的注册表里。

  MSCorEE.dll(垫片)

  MSCorEE.dll的职责是判断创建何种版本的CLR。 非托管应用程序宿主调用MSCorEE.dll(shim)中CorBindToRuntimeEx函数或者另一个相似的函数来创建CLR COM的实例。     

  一台机器可以安装多个版本的CLR,但在机器中只有一个版本的MSCorEE.dll文件。以上两者之间的关系如下代码所示(c++):MSCorEE.dll(垫片)---->CLR(COM服务器)

#include <Windows.h>
#include <MSCorEE.h>
#include <stdio.h>
#pragma comment(lib,"mscoree.lib")
int main(int argc, CHAR* argv[])
{
    ICLRRuntimeHost *pClrHost;
    //调用<MSCorEE.h>中的CorBindToRuntimeEx()生成COM服务器
    HRESULT hr= CorBindToRuntimeEx(NULL, NULL, NULL, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&pClrHost); 
    //启动clr
    pClrHost->Start();   
     //............................其他操作   
     //终止clr
     pClrHost->Stop();
     getchar();
     return 0;
}

  应用程序域(AppDomain)

  一个应用程序域是一组程序集的一个容器。应用程序域的全部目的就是提供隔离性。

  上图为一个单独的Windows进程,该进程中运行着一个CLR COM服务器。该CLR中每个应用程序域都有自己的加载器堆。(系统域,共享域,默认域#1,其他域#2)

   一些特殊的程序集如MSCorLib.dll,它需要被所有的应用程序域共享,那么他就以一种对应用程序域保持中立的方式被加载,由CLR维护一个特殊的加载器堆。

  线程与应用程序域的关系

  线程与应用程序域没有一对一的关系。多个应用程序域可以位于一个Windows进程中,所以一个线程可以执行一个应用程序域中的代码,然后又执行另一个应用程序域中的代码。从CLR的角度看,线程每次只能执行一个应用程序域中的代码。线程可以通过Thead的静态方法GetDomain来请求CLR当前正在那个应用程序域中执行。

  关于卸载的问题

  一旦CLR加载到Windows的进程,就永远不会被卸载,要想卸载进程中的CLR,只能终止进程,导致Windows清理该进程使用的所有资源。

  共享域的程序集永远不会被卸载,回收它们的唯一方式就是终止Windows进程。

  卸载一个应用程序域(默认域#1,其他域#2)可以导致CLR卸载应用程序域中的所有程序集,并且释放应用程序域的加载器堆。

  ASP.NET 应用程序

  ASP.NET是一个ISAPI DLL(实现于ASPNET_ISAPI.DLL中)。

      ①当客户端请求一个由ASP.NET ISAPI DLL处理的URL时(第一次),ASP.NET会创建一个工作进程(ASPNET_wp.exe / w3wp.exe即宿主,工作进程是一个寄宿有CLR COM服务器的Windows进程)。

      ②CLR为该Web程序创建一个新的应用程序域。(参考上面的图)

      ③CLR将必要的程序集加载到新建的应用程序域中。

      ④CLR创建一个Web应用程序类型的实例,调用其中方法响应客户端请求。随着Web应用程序的运行,如果代码中引用到了更多类型,CLR会继续将必要的程序集加载到当前Web应用程序的应用程序域中。

  当更多的客户端向一个已经运行的Web应用程序发出请求时,ASP.NET不会再去创建新的应用程序域,相反,它会使用现有的应用程序域,创建一个新的Web应用程序类型的实例,并调用其中的方法。这些方法被JIT编译成了本地代码,所以后续客户端的请求处理性能将会有所提高。

  看下我们的工作进程,如下任务管理器截图中所示:

  ASP.NET 应用程序生命周期的各个阶段
  (一)用户从 Web 服务器请求应用程序资源(映射文件扩展名)

  ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点。ASP.NET 是 Web 服务器下的 ISAPI 扩展。Web 服务器接收到请求时,会对所请求的文件的文件扩展名进行检查,确定应由哪个 ISAPI 扩展处理该请求,然后将该请求传递给合适的 ISAPI 扩展。ASP.NET 处理已映射到其上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。

  (二)ASP.NET 接收对应用程序的第一个请求。
  当 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为 ApplicationManager 的类会(1)创建一个应用程序域。在应用程序域中,(2)将HostingEnvironment 类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。下面的关系图说明了这种关系:

  运行ASP.NET的进程为W3WP.EXE。

  编写下述代码,我们可以观察一下HostingEnvironment 的各种属性:

 1 <script runat="server">
 2   protected void Page_Load(object sender, EventArgs e)
 3   {
 4       StringBuilder sb = new StringBuilder();
 5       sb.Append(System.Web.Hosting.HostingEnvironment.ApplicationID).Append("<br/>")
 6           .Append(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath).Append("<br/>")
 7            .Append(System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath).Append("<br/>")
 8             .Append(System.Web.Hosting.HostingEnvironment.SiteName).Append("<br/>")
 9              .Append(System.Web.Hosting.HostingEnvironment.ApplicationHost.ToString());      
10       Response.Write(sb.ToString());    
11   }
12  </script>

  输出内容为:

a215d83d                                                   //ApplicationID
E:\MVC\Jasen\Jasen.Web\                                    //存储该应用程序的文件夹的名称
/
默认网站
System.Web.Hosting.SimpleApplicationHost 

  (三)为每个请求创建 ASP.NET 核心对象。
  ASP.NET 创建并初始化核心对象,如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequest 和 HttpResponse 对象。HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。HttpResponse 对象包含发送到客户端的响应,包括所有呈现的输出和 Cookie。
  (四)将 HttpApplication 对象分配给请求
  初始化所有核心应用程序对象之后,将通过创建 HttpApplication 类的实例启动应用程序。如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类的一个实例,并使用该派生类表示应用程序。MVC  Global.asax文件内容如下:

 1  public class MvcApplication : System.Web.HttpApplication
 2     {
 3         protected void Application_Start()
 4         {

            //AreaRegistration.RegisterAllAreas();
            //RegisterGlobalFilters(GlobalFilters.Filters);
            //ViewEngines.Engines.Add(new ViewEngine());

            //RegisterRoutes(RouteTable.Routes);
 5             //请求 ASP.NET 应用程序中第一个资源时调用。在应用程序的生命周期期间仅调用一次 
 6             //Application_Start 方法。可以使用此方法执行启动任务,如将数据加载到缓存中以及初始化静态值。 
 7 
 8             //在应用程序启动期间应仅设置静态数据。
 9          }
10 
11         public override void Init()
12         {
13             base.Init();//在创建了所有模块之后,对 HttpApplication 类的每个实例都调用一次。
14          }
15 
16         public override void Dispose()
17         {
18             base.Dispose();//在销毁应用程序实例之前调用。可使用此方法手动释放任何非托管资源。
19          }
20 
21         public void Application_End()
22         {
23             //在卸载应用程序之前对每个应用程序生命周期调用一次。
24          }
25     }

  HttpApplication 进程的一个实例每次只处理一个请求。Application_Start 和 Application_End 方法,在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次。

  (五)由 HttpApplication 管线处理请求。在处理该请求时将由 HttpApplication 类执行以下事件。

  1.对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。

  2.如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

  3.引发 BeginRequest 事件。

  4.引发 AuthenticateRequest 事件。引发 PostAuthenticateRequest 事件。

  5.引发 AuthorizeRequest 事件。引发 PostAuthorizeRequest 事件。

  6.引发 ResolveRequestCache 事件。引发 PostResolveRequestCache 事件。

  7.根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。

  8.引发 PostMapRequestHandler 事件。

  9.引发 AcquireRequestState 事件。引发 PostAcquireRequestState 事件。

  10.引发 PreRequestHandlerExecute 事件。

  11.为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法。例如,如果该请求针对某页,则当前的页实例将处理该请求。一般处理文件ashx的ProcessRequest():速度较快

  12.引发 PostRequestHandlerExecute 事件。

  13.引发 ReleaseRequestState 事件。引发 PostReleaseRequestState 事件。

  14.如果定义了 Filter 属性,则执行响应筛选。

  15.引发 UpdateRequestCache 事件。引发 PostUpdateRequestCache 事件。

  16.引发 EndRequest 事件。

  17.引发 PreSendRequestHeaders 事件。

  18.引发 PreSendRequestContent 事件。

  2年多了,回过来再重新温习一次,感觉不错。

时间: 2024-09-15 06:13:16

一起谈.NET技术,关于ASP.NET与CLR相互关系的一些总结的相关文章

关于ASP.NET与CLR相互关系的总结

CLR(COM服务器) CLR作为一个COM服务器实现在MSCorWks.dll文件中.安装.NET Framework时,表示 CLR的COM服务器被注册到Windows的注册表里. MSCorEE.dll(垫片) MSCorEE.dll的职责是判 断创建何种版本的CLR. 非托管应用程序宿主调用MSCorEE.dll(shim)中CorBindToRuntimeEx函数或者另一个 相似的函数来创建CLR COM的实例.     一台机器可以安装多个版本的CLR,但在机器中只 有一个版本的MS

一起谈.NET技术,Asp优化,asp缓存技术

一.何谓asp缓存/为什么要缓存 当你的web站点采用asp技术建立的初期,可能感觉到的是asp动态网页技术带来的便利性,以及随意修改性. 自如的http控制.但是,随着访问量的增加,你一定会发现自己的站点访问速度越来越慢,IIS重新启动得越来越频繁.接下来,你一定想优化asp,诸如更换性能更优异的数据库.建立索引.编写存储过程等等.这些措施有些不需要增加成本压力,有些则成本压力很大(譬如丛access到SQL),而且效果还不一定. 面对web访问压力,我认为最经济的办法是利用缓存优化技术来实现

一起谈.NET技术,ASP.NET MVC 2示例Tailspin Travel UI层分析

Tailspin Travel 是一个旅游预订的应用程序示例,最新版本采用ASP.NET MVC 2技术构建,主要使用 DataAnnotations 验证, 客户端验证和ViewModels,还展示了许多Visual Studio 2010, .NET Framework 4, 和Windows Server AppFabric的技术,参看ASP.NET MVC 2示例Tailspin Travel. Tailspin Travel设计的技术比较多,今天我们来看看界面(UI)上的技术,在UI层

一起谈.NET技术,asp.net控件开发基础(15)

继续我们的话题吧.自定义控件.如果你还不熟悉自定义控件开发的话,还请看看我以前写了几篇,希望对你有帮助 1.1何处继承 自定义控件一般从以下几个基类(此处不包含数据控件) 一.Control类(所有服务器控件的基类,算是比较底层的类,如果控件功能比较简单,要求不多,可直接继承此类.) 二.WebControl类(标准控件的基类,继承此类,你可以继承其丰富的公共属性,若标准控件中的控件没有你需要的控件,你可以继承此类) 三.CompositeControl 类(2.0新增的类,此类继承自WebCo

一起谈.NET技术,ASP.NET MVC 2中使用jQuery UI控件详解

问:我想给我的ASP.NET MVC输入表单添加一个日期选择控件,但模型-视图-控制器(MVC)并没有提供这样的辅助方法,我该如何添加控件? 答:和ASP.NET Web表单不一样,MVC架构没有提供可以在设计面板中拖放的有状态的服务端控件,相反,MVC鼓励使用简单的HTML布局元素和基于数据的标签作为页面布局的要素,功能和最终的布局用客户端JavaScript和CSS样式表控制. MVC提供了一套基于HtmlHelper的扩展方法渲染大部分HTML标签,对于更复杂的功能,你需要自己编写HTML

一起谈.NET技术,ASP.NET调用.sql文件(二)

笔者前一阵子发表了一篇<ASP.NET调用.sql文件>文章,主要是是解决数据库配置,减去传统手工附加数据库和自己改写web.config文件等等这些复杂的过程,而是配置的向导.其中给出关键的技术知识点,就是通过sql数据库生成数据库脚本即.sql文件,然后通过调用osql.exe来执行.sql文件. 这里,园友首先质疑了其安全性,认为程序存在被他人利用的危险.笔者对这方面没有太多经验,希望来位高人讲讲这方面的知识或者演示被利用的过程.所以这块还是一个未知的领域,笔者也不敢保证绝对安全,但是至

一起谈.NET技术,ASP.NET页面间数据传递的方法

00.引言 Web页面是无状态的, 服务器对每一次请求都认为来自不同用户,因此,变量的状态在连续对同一页面的多次请求之间或在页面跳转时不会被保留.在用ASP.NET 设计开发一个Web系统时, 遇到一个重要的问题是如何保证数据在页面间进行正确.安全和高效地传送,Asp.net 提供了状态管理等多种技术来解决保存和传递数据问题,以下来探讨.NET 下的解决此问题的各种方法和各自的适用场合. 1.ASP.NET页面间数据传递的各种方法和分析 1.1 使用Querystring 方法 QueryStr

一起谈.NET技术,ASP.NET的Session 详解

阅读本文章前,需要读者对以下知识有所了解.否则,阅读过程中会在相应的内容上遇到不同程度的问题. 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的Session模型 了解ASP.NET Web应用程序模型 了解ASP.NET Web应用程序配置文件Web.config的作用.意义及使用方法 了解Internet Information Services(以下简称IIS)的基本使用方法 了解如何在Microsoft SQL Server中创建一个数据库. Session模型简介 Sess

一起谈.NET技术,ASP.NET 4的Demo实践:URL路由改进支持

从.NET框架3.5 SP1开始,微软推出了ASP.NET路由支持,从而实现了特定资源的URL与其对应的Web服务器上的物理文件之间的彻底解耦.借助于ASP.NET路由支持,开发人员可以定义一组路由规则,从而实现把路由模式映射到一个生成相应内容的类.例如,你可以把URLCategories/CategoryName映射到一个类,该类接收CategoryName而最终生成对应于此种类的产品信息显示于一个网格中的一组HTML标记.有了这样的映射,用户便可以通过访问www.yoursite.com/C