对于.aspx页面,这个扩展就是as.net_isapi.dll。因为这些ISAPI都是非托管的Win32应用,直接对它们进行改动是比较困难的。所以,为了增强Asp.net运行时的可扩展性,aspnet_isapi.dll本身的功能非常少,我们可以把aspnet_isapi.dll简单理解为请求信息的路由器,负责把请求从IIS传送到asp.net运行时。而后面我们将要讲到的HttpHandle和HttpModule则分别担负起了ISAPI Extension和ISAPI Filter的功能,幸运的是,HttpHandle和HttpModule可以由纯的托管代码来实现。
二.从非托管代码到托管代码
前面说了,aspnet_isapi.dll是非托管代码,而asp.net运行时是托管代码,他们都运行在w3wp.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运行时,所以代码里的注释是笔者添加的关键性说明,后面的所有代码段都是这样):
1/**//*InterfaceType(ComInterfaceType.InterfaceIsIUnknown)指明了这个接口将作为 IUnknown 派生接口向 COM 公开,这就使得isapi.dll可以以COM方式调用此接口。*/
2[ComImport, Guid("08a2c56f-7c16-41c1-a8be-432917a1a2d1"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
文章来源于领测软件测试网 https://www.ltesting.net/