知识大全 从.NET类库代码来看ASP.NET运行时[1]
Posted 知
篇首语:你最愿意做的那件事,才是你真正的天赋所在。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 从.NET类库代码来看ASP.NET运行时[1]相关的知识,希望对你有一定的参考价值。
从.NET类库代码来看ASP.NET运行时[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
写在前面的话 网上讲Asp net运行模式的好文章已经很多了 笔者本不用多此一举 另成一文 但从笔者自己的学习经验看 如果学到的这些知识不能对应到类库中的源代码 印象总归不够深刻 大有隔靴搔痒之感 只好自己写上一篇 对这方面的知识做个小小的总结 文中所有内容都是笔者在看了网上很多文章后 结合自己的开发经验得出的一些理解 难免有错误的地方 欢迎批评指出 另外 由于笔者能力所限 很多地方并未说透(真正对应到代码) 也盼高手能够给予补充 一 进入Asp net运行时之前 虽然本文的重点是对托管代码的解析 但为了整个知识点的完整性 这里简单介绍一下IIS处理请求的一些基本情况 在一个IIS服务器上 你可以设置多个应用程序池(每个应用程序池可以单独设置允许使用的最大内存数量 CPU使用率 回收工作进程的时间间隔等参数 而且一个应用程序池里面只能使用一个版本的 NET Framework) 然后把自己的Web应用分别部署到这些应用程序池中 在默认情况下 每个应用池会有一个工作进程w wp exe来维护(如果开通了Web园功能 也可以设置多个工作进程) 每个应用程序(虚拟目录)在池中都有自己的应用程序域 这些应用程序域都处于这个应用程序池的工作进程的进程空间内 IIS是通过各种ISAPI的扩展来处理各种类型的应用的 当我们从客户端提交一个请求过来之后 IIS会根据请求的页面或者服务的类型 把请求映射到指定的ISAPI扩展 比方说 如果我们需要让IIS支持perl这样的服务器端程序(当然 这个移植工作早就有人做过了) 我们就需要编写一个专门处理对perl页面进行的请求的ISAPI扩展 根据ISAPI的定义(符合这个定义的ISAPI扩展才能和IIS正常交互) 在你的扩展中可以包括ISAPI Extension和ISAPI Filter两大部分 ISAPI Extension是对请求的处理程序 完成和web服务器之间的输入输出 而ISAPI Filter则是一些回调接口 你可以通过实现这些接口来介入到整个请求处理的每一步骤 对Authentication RevolveCache等环节进行控制 另外 ISAPI本身就是在工作进程里运行的 而asp net运行时也是在工作进程里运行的 所以两者的交互非常有效率 对于 aspx页面 这个扩展就是aspnet_isapi dll 因为这些ISAPI都是非托管的Win 应用 直接对它们进行改动是比较困难的 所以 为了增强Asp net运行时的可扩展性 aspnet_isapi dll本身的功能非常少 我们可以把aspnet_isapi dll简单理解为请求信息的路由器 负责把请求从IIS传送到asp net运行时 而后面我们将要讲到的HttpHandle和HttpModule则分别担负起了ISAPI Extension和ISAPI Filter的功能 幸运的是 HttpHandle和HttpModule可以由纯的托管代码来实现 二 从非托管代码到托管代码 前面说了 aspnet_isapi dll是非托管代码 而asp net运行时是托管代码 他们都运行在w wp exe工作进程里面 那么两者之间的调用点发生在什么地方呢?在介绍接下来的内容之前必须先介绍一个概念 ECB ECB的全称是Extension Control Block 它是一个非托管资源包 具有对ISAPI接口完整的访问能力 包含了所有和一个传入请求有关的底层信息 如提交的标单中的数据等等 所以说 asp net中的托管代码想要访问aspnet_isapi dll对外提供的接口 就需要通过ECB 其实更准确的来说 是托管代码公布了一个IUnknown类型的接口供aspnet_isapi dll调用 而aspnet_isapi dll在调用的时候会把自己的ecb地址传进去 明白了ECB的概念 下面我们要介绍一个接口和一个接口的实现类(位于System Web Hosting名字空间下) 请读者注意笔者在代码中的注释(本文的主要目的就是和大家一起从代码实现的角度来认识整个Asp net运行时 所以代码里的注释是笔者添加的关键性说明 后面的所有代码段都是这样) /**//*InterfaceType(ComInterfaceType InterfaceIsIUnknown)指明了这个接口将作为 IUnknown 派生接口向 公开 这就使得isapi dll可以以方式调用此接口 */ [ComImport Guid( a c f c c a be a a d ) InterfaceType(ComInterfaceType InterfaceIsIUnknown)] public interface IISAPIRuntime void StartProcessing(); void StopProcessing(); /**//*ProcessRequest方法就是整个处理流程中托管代码和非托管代码的分界点 可以看到里面是以一个IntPtr结构传入了调用方(也就是isapi dll)的ECB地址*/ [return: MarshalAs(UnmanagedType I )] int ProcessRequest([In] IntPtr ecb [In MarshalAs(UnmanagedType I )] int useProcessModel); void DoGCCollect(); /**//*这个类实现了IISAPIRuntime接口 它的实例对象存在于每一个AppDomain中 作为整个Asp net运行时的入口 */ public sealed class ISAPIRuntime : MarshalByRefObject IISAPIRuntime IRegisteredObject // Fields private static int _isThisAppDomainRemovedFromUnmanagedTable; private static string s_thisAppDomainsIsapiAppId; // Methods [AspNetHostingPermission(SecurityAction Demand Level=AspNetHostingPermissionLevel Minimal) SecurityPermission(SecurityAction Demand Unrestricted=true)] public ISAPIRuntime(); public void DoGCCollect(); public override object InitializeLifetimeService(); /**//*处理请求的入口点方法 由isapi dll以方式调用*/ public int ProcessRequest(IntPtr ecb int iWRType); internal static void RemoveThisAppDomainFromUnmanagedTable(); internal void SetThisAppDomainsIsapiAppId(string appId); public void StartProcessing(); public void StopProcessing(); void IRegisteredObject Stop(bool immediate); 所以 一切都是从aspnet_isapi dll以方式调用了一个ISAPIRuntime对象的ProcessRequest方法开始的 可以多提一句的是 这种调用是异步的 也就是说 aspnet_isapi dll在调用后会立即返回 但ECB会一直保留下来 直到整个请求被处理完毕之后再释放 cha138/Article/program/net/201311/15294相关参考
复制代码代码如下:cha138/Article/program/net/201404/30515
ASP.NET上的ReCAPTCHA类库 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! reCA
cha138/Article/program/net/201311/14235
我们经常看到在一些博客页面里可以发表评论通过电子邮件通知版主(例如咱们的博客园)那么如何用发送电子邮件呢?我们可以借助NET提供的强大的类库达到目的 首先我们要引入SystemWebMail命名
ASP.NET2.0运行时简要分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!概述:
知识大全 ASP.NET入门教程 1.7.4 示例代码目录[1]
ASP.NET入门教程1.7.4示例代码目录[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&
ASP.NET学习笔记之.net代码技巧 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一usi
知识大全 ASP.NET入门教程 10.4 创建后台代码文件[1]
ASP.NET入门教程10.4创建后台代码文件[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 ASP.NET入门教程 1.7.4 示例代码目录[2]
ASP.NET入门教程1.7.4示例代码目录[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&
知识大全 ASP.NET入门教程 11.4 在代码中使用角色[1]
ASP.NET入门教程11.4在代码中使用角色[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!