ASPNET揭秘笔记之五

使用Http处理程序(Handler)和模块(Module)

使用HTTP处理程序(handler)
    可以处理所有针对某些扩展名、路径或请求类型的请求。可以使用Handler处理程序来处理对Asp.Net页面或任何其他文件类型(如图片或文件)的请求。
    典型应用有实现自定义验证架构和自定义过滤器。比如,可以创建一个处理程序来验证针对图片文件的请求,或者可以创建一个处理程序自动把请求从一个文件传递给另一个文件。
    所有对asp.net web站点的请求都是有Handler来相应的,比如,所有对.aspx的文件访问都是由PageHandlerFactory类来处理的。这个类产生了PagerHandler类的实例来响应对.aspx页面的每个请求。

创建自己的Handler步骤:
1、创建一个实现了IHttpHandler接口的类。
2、在Web.Config文件中添加对这个Handler的引用。

实现IHttpHandler接口

public class MyHttpHandler
    
implements IHttpHandler
   
    
public sub ProcessRequest(content as HttpContext)
      
' do something
    end sub
 
   
    
public readonly property IsReusable() as Boolean
    
get 
       
return true
    
end get
    
end property
 
end Class

    ProcessRequest()方法就是我们处理请求并作出响应的地方。你可以通过Request属性来获取请求信息,同时也可以通过Response属性发送回几乎任意格式的数据。
    IsReusable属性告诉Asp.net是否HttpHandler处理器的实例能被多个请求复用,或者它是否应该每次都创建一个新的实例。通常这个属性返回True。特别是在HttpHandler要服务于多个请求时。如果用户特定的操作在处理器发生了,而又不希望下一个用户接着使用,那么就将这个属性返回False。

向Web.Config文件中添加一个HttpHandler
<System.Web>
   
<httpHandlers>
      
<add verb="*" path="*.jpg" type=myClass,MyDll" />
   
</httpHandlers>
</System.Web>

Verb属性表示请求类型(Get或者Post),“*”表示接受所有请求。
Path属性表示请求的文件路径。加上".jpg"表示希望处理所有对.jpg文件的请求。
type属性指定了实现IHttpHandler接口的类以及类所在的程序集(assembly)名称,在/bin文件夹中寻找程序集,类名需要完全被限定,即需要包含Name space。


使用Http模块(module)

Asp.Net框架包含几个用于管理状态和实现验证架构等的标准模块,比如,输出缓存、会话状态、表单验证和Windows验证等都是作为模块实现的。
可以用自己的模块来代替任何标准模块,如可以用自己编写的模块来代替标准的会话状态模块。也可以通过创建一个全新的模块来扩展ASP.Net框架的功能,,比如实现一个自定义的缓存机制或创建自定义验证系统。
创建自己的模块步骤:
1、创建一个实现了IHttpModule接口的类
2、在web.config文件中添加对该模块的引用。

Imports System
Imports System.Web
Imports Microsoft.VisualBasic

Public Class AuthModule
    
Implements IHttpModule

    
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose

    
End Sub


    
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
        
AddHandler context.AuthenticateRequest, AddressOf Me.OnEnter
        
AddHandler context.EndRequest, AddressOf Me.OnLeave
    
End Sub


    
Public Sub OnEnter(ByVal s As ObjectByVal e As EventArgs)
        
Dim objApp As HttpApplication
        
Dim objContext As HttpContext
        
Dim strPath As String

        objApp 
= CType(s, HttpApplication)
        objContext 
= objApp.Context

        strPath 
= objContext.Request.Path.ToLower()

        
If Right(strPath, 10<> "login.aspx" Then
            
If objContext.Request.Params("username"= Nothing Then
                objContext.Response.Redirect(
"default.aspx")
            
End If
        
End If

    
End Sub


    
Public Sub OnLeave(ByVal s As ObjectByVal e As EventArgs)

    
End Sub

End Class


Init()方法为我们提供了钩入(hook)应用程序的入口,通过应用程序的引用参数,我们可以将事件处理器绑定到应用程序事件。
如果应用程序结束时需要完成清理工作,可以在Dispose()方法中做这个工作。
例如,可以在这个方法中删除临时文件或者数据库记录。
在Init子程序中,OnEnter子程序与Application_Authenticate事件关联,而OnLeave子程序则与Application_EndRequest事件关联.

在使用AuthModule模块之前,需要经过编译,在命令提示行输入
vbc /t:library /r:System.dll,System.Web.dll  AuthModule.vb

编译后,将AuthModule.dll文件移到/bin目录下。
然后在web.config文件中添加对模块的引用
<system.web>
   
<httpModules>
      
<add name="authmodule" type="AuthModule,AuthoMdoule" />
   
</httpModules>
</system.web>
Type属性值就是类的名称和程序集的名称。
posted @ 2008-07-17 09:13  年华倒影  阅读(154)  评论(0)    收藏  举报