第二十九讲 深入解析ASP.NET架构

*摘要
。ASP.NET请求的处理过程
。HttpModule
。HttpHandler
。HttpModule和HttpHandler使用实例
。ASP.NET事件模型机制

* ISAPI
。在Internet时代的开端,客户端的需求非常有限;.htm文件就可以满足他们的需求。但是,随着时间的流逝,客户端需求的扩充超越了.htm文件或静态文件所包含的功能。
。开发者需要扩充或扩展Web服务器的功能。Web服务器厂商设计了不同的解决方案,但是都遵循同一个主题“向Web服务器插入某些组件。”所有的Web服务器的功能。微软公司提出了ISAPI(Internet服务器API),网景公司提出了NSAPI(网景服务器API)等等

ISAPI是一种重要的技术,它允许我们增强与ISAPI兼容的We服务器(IIS就是一种与ISAPI兼容的Web服务器)的能力。我们使用下面的组件达到这个目的:
。ISAPI扩展:ISAPI扩展是使用Win32动态链接库来实现的。你可以把ISAPI扩展看作是一个普通的应用程序。ISAPI扩展的处理目标是http请求。
。ISAPI过滤器:客户端每次向服务器发出请求的时候,请求要经过过滤器。客户端不需要在请求中指定过滤器,只需要简单地把请求发送给Web服务器,接着Web服务器把请求传递给相关的过滤器。接下来过滤器可能修改请求,执行某些登录操作等等。

* ASP.NET请求的处理过程
。ASP.NET请求处理过程是基于管道模型的,在模型中ASP.NET把http请求传递给管道中的所有模块。每个模块都接收http请求并有完全控制权限。模块可以用任何自认为适合的方式来片是请求。一旦请求经过了所有HTTP模块,就最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过管道中的HTTP模块。

* ISAPI的筛选器
。IIS本身是不支持动态页面的,也就是说它仅仅支持静态HTML页面的内容,对于如.asp,.aspx,.cgi,.php等,IIS并不会处理这些标记,它就会把它当作文本,丝毫不做处理发送到客户端。为了解决这个问题。IIS有一种机制,叫做ISAPI的筛选器,它是一个标准组件(COM组件)
。ASP.NET服务在注册到IIS的时候,会把每个扩展可以处理的文件扩展名注册到IIS里面(如:.aspx,.ascx等)。扩展启动后,就根据定义好的方式来处理IIS所不能处理的文件,然后把控制权跳转到专门处理代码的进程中。让这个进程开始处理代码,生成标准的HTML代码,生成后把这些代码加入到原有的HTML中,最后把完整的HTML返回给IIS,IIS再把内容发送到客户端。


*HttpModule
。HttpMOdule实现了ISAPI Filter的功能,是通过对IHttpModule接口的继承来处理。
。HTTP模块是实现了System.Web.IHttpModule接口的.NET组件。这些组件通过在某些事件中注册自身,把自已插入ASP.NET请求处理管道。当这些事件发生的时候,ASP.NET调用对请求有兴趣的HTTP模块,这样该模块就能处理请求了。

* HttpModule的实现
1、编写一个类,实现IHttpModule接口
2、实现Init方法,并且注册需要的方法
3、实现注册的方法
4、实现Dispose方法,如果需要手工为类做一些清除工作,可以添加Dispose方法的实现,但这不是必需的,通常可以不为Disponse方法添加任何代码。
5、在Web.config文件中,注册您编写的类。

* WebConfig设置
<httpModules>
 <add name="modulename" type="classname,assemblyname"  />
 <remove name="modulename" />
 <clear/>
</httpModules>

子标记说明:
。<add>将HttpModule类添加到应用程序。请注意,如果以前已指定了相同的谓词/路径组合(例如在父目录的Web.config文件中),则对应的第二个调用将重写以胶的设置。
。<remove>从应用程序移除HttpModule类。
。<clear>从应用程序移除所有HttpModule映射。

*深入研究HttpModule
HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响,这些事件在HttpModule的Init方法中进行注册

,包括:
BeginRequest
AuthenticateRequest
AuthorizeRequest
ResolveRequestCache
AcquireRequrestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
UpdateRequestCache
EndRequest

* HttpHandler
。HttpHandler实现了ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。
。HTTP处理程序是实现了System.Web.IHttpHandler接口的.NET组件。任何实现了IHttpHandler接口的类都可以用于处理输入的HTTP请求

。HTTP处理程序与ISPAI扩展有些类似。HTTP处理程序和ISAPI扩展的差别在于在URP中可以使用HTTP处理程序的文件名称直接调用它们,

与ISAPI扩展类似。

* HttpHandler的实现
实现我们的HTTP处理程包含以下步骤:
。编写一个实现IHttpHandler接口的类。
。在Web.config或machine.config文件中注册这个处理程序。
。在Internet服务管理器中把文件扩展(你想要处理的文件扩展名)映射到ASP.NET ISAPI扩展DLL(aspnet_isapi.dll)上。

* 在HttpHandler在访问Session
。不能直接通过HttpContext访问
。必须实现IRequiresSessionState接口
。IRequiresSessionState接口指定目标HTTP处理程序接口具有对会话状态值的读写访问权限。这个一个标记接口,没有任何方法。

* ASP.NET事件模型机制
。ASP.NET之所以对于以前的ASP是一个革命性的巨变,在很大程度上是由于ASP.NET技术是一完全基于事件驱动的全新技术。
。在ASP.NET中事件的触发和处理分别是在客户端和服务器段进行的。
。ASP.NET中,如果频繁和服务器进行事件信息的传递,会大大降低服务器的处理效率和性能,因而有些事件如OnMouseOver没有提供。
。但提供了Change事件。为了提高效率它们被缓存在客户端。等到再一次事件信息被发送到服务器端时一同发送回去。

原文地址:https://www.cnblogs.com/iceberg2008/p/1431630.html