ASP.NET请求的处理过程
ASP.NET请求处理过程是基于管道模型的,在模型中ASP.NET把http请求传递给管道中的所有模块。每个模块都接收http请求并有完全控制权限。模块可以用任何自认为适合的方式来处理请求。一旦请求经过了所有HTTP模块,就最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过管道中的HTTP模块:
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' height=277 alt="" src="/uploadfile/201301/9/9882046861.jpg" width=199 border=0>
请注意在http请求的处理过程中,只能调用一个HTTP处理程序,然而可以调用多个HTTP模块。
Http处理程序
HTTP处理程序是实现了System.Web.IHttpHandler接口的.NET组件。任何实现了IHttpHandler接口的类都可以用于处理输入的HTTP请求。HTTP处理程序与ISAPI扩展有些类似。HTTP处理程序和ISAPI扩展的差别在于在URL中可以使用HTTP处理程序的文件名称直接调用它们,与ISAPI扩展类似。
HTTP处理程序实现了下列方法:
方法名称 | 描述 |
ProcessRequest | 这个方法实际上是http处理程序的核心。我们调用这个方法来处理http请求。 |
IsReusable | 我们调用这个属性来决定http处理程序的实例是否可以用于处理相同其它类型的请求。HTTP处理程序可以返回true或false来表明它们是否可以重复使用。 |
你可以使用web.config或者machine.config文件把这些类映射到http请求上。映射完成以后,当接收到相应请求的时候ASP.NET会实例化http处理程序。我们将解释如何在web.config和/或machine.config文件中定义所有这些细节信息。
ASP.NET还通过IHttpHandlerFactory接口支持http处理程序的扩展。ASP.NET提供了把http请求路由到实现IHttpHandlerFactory接口的类的对象上的能力。此外,ASP.NET还利用了Factory设计模式。这种模式为建立一组相关对象而不提供具体类的功能提供了接口。简单的说,你可以把用于建立依赖传递进来的参数建立的http处理程序对象的类看作是factory(工厂)。我们不用指定需要实例化的特定的http处理程序;http处理程序工厂处理这种事务。这样做的优点在于如果未来实现IHttpHandler接口的对象的实现方法发生了改变,只要接口仍然相同,客户端就不会受到影响。
下面是IHttpHandlerFactory接口中的方法列表:
方法名称 | 描述 |
GetHandler | 这个方法负责建立适当的处理程序并把它的指针返回到调用代码(ASP.NET运行时)。这个方法返回的处理程序对象应该实现了IHttpHandler接口。 |
ReleaseHandler | 这个方法负责在请求处理完成后释放http处理程序。Factory 实现决定了它的操作。Factory 实现可以是实际摧毁实例,也可以把它放入缓冲池供以后使用。 |
在配置文件中注册HTTP处理程序和HTTP处理程序工厂
ASP.NET在下面的配置文件中维护自己的配置信息:
· machine.config
· web.config
machine.config文件包含应用于计算机上安装的所有Web应用程序的配置设置信息。
web.config文件对于每个Web应用程序来说是特定的。每个Web应用程序都有自己的web.config文件。Web应用程序的任何子目录也可能包含自己的web.config文件;这使得它们能够覆盖父目录的设置信息。
为了给我们的Web应用程序添加HTTP处理程序,你可以使用<httpHandlers>和<add>节点。实际上,处理程序都带有<add>节点,列举在<httpHandlers>和</httpHandlers>节点之间。下面是添加HTTP处理程序的一个普通的例子:
- <httpHandlers>
- <add verb="supported http verbs" path="path" type="namespace.classname, assemblyname" />
- <httpHandlers>
在上面的XML中,
· Verb属性指定了处理程序支持的HTTP动作。如果某个处理程序支持所有的HTTP动作,请使用“*”,否则使用逗号分隔的列表列出支持的动作。因此如果你的处理程序只支持HTTP GET和POST,那么verb属性就应该是“GET, POST”。
· Path属性指定了需要调用处理程序的路径和文件名(可以包含通配符)。例如,如果你希望自己的处理程序只有在test.xyz文件被请求的时候才被调用,那么path属性就包含“test.xyz”,如果你希望含有.xyz后缀的所有文件都调用处理程序,path属性应该包含“*.xyz”。
· Type属性用名字空间、类名称和部件名称的组合形式指定处理程序或处理程序工厂的实际类型。ASP.NET运行时首先搜索应用程序的bin目录中的部件DLL,接着在全局部件缓冲(GAC)中搜索。