ASP.NET伪静态(IHttpModule方式)的实现代码

发布时间:2020-06-13编辑:脚本学堂
asp.net实现伪静态的方法有多种,本文介绍通过IHttpModule接口来实现的方法,有需要的朋友参考下吧。

实现伪静态时,需要在请求发生之时对请求的地址进行处理,则要用到IHttpModule接口。

伪静态,多是将一个Get访问的查询字符串变成一个独立的文件。

但是在程序中实际上访问的还是查询字符串中的值。如:
Http://www.jb200.com/news.aspx?id=1
改变为:
Http://www.jb200.com/news_1.aspx
好处:
有利于SEO及防止sql注入等。
当然,文件的扩展名在服务器支持的情况下也是可以变化的。

我们需要实现IHttpModule接口中的两个方法:
Dispose() 处置由实现 IHttpModule 的模块使用的资源(内存除外)。
Init() 初始化模块,并使其为处理请求做好准备。

第一步:如果要在应用程序中使用IHttpModule ,则需要配制web.config文件。
在Web.config文件中,我们需要对httpModules元素进行投置,该节点在system.web元素中。如下:
 

复制代码 代码示例:
<httpModules>
       <add name="HttpModule" type="WebApplication1.HttpModule"/>
</httpModules>

注意:其中type,必须为实现了IHttpModule接口的类型的俱体路径(包括命名空间)。

第二步:实现IHttpModule
新建一个HttpModule类,与配制文件中的类型命名空间路径相同。

使用该类实现IHttpModule接口。

开始的代码将写在Init方法中,该方法中的HttpApplication对象context包括程用程序对象的所有方法,属性和事件。
在这个对象中,我们可以开始一个请求事件的处理。

在Init方法中:
 

context.BeginRequest += new EventHandler(context_BeginRequest);


以上代码,为请求开始事件注册了一个委托方法。

在注册委托方法时,可以在写完+=后,连续按两次Tab键,会自动生成context_BeginRequest方法。

第三步:关于context_BeginRequest()方法
在context_BeginRequest方法中,我们可根据请求的不同,进行请求的重新定向。这样就可以将虚拟的伪静态路径变成我们程序所需要的Get方式查询字符串。

要想改变请求,就必须得到当前求请,在ASP.NET中,使用HttpContext类型来封装所有请求对象。
可以通过刚刚的HttpApplication对象来获取HttpContext对象。如:
 

HttpApplication application = sender as HttpApplication;
HttpContext context = application.Context;

第四步:得到请求与重定向
1、得到请求:
可以使用HttpContext对象的属性Request来获取当前请求。
在得到当前请求后,可以使用正则表达式,从请求中获取所需的可变信息,用来重新定向到新的位置。
 
2、重定向:
可以使用HttpContext对象的方法RewritePath,可以将得到的新路径放到方法参数中。
  

复制代码 代码示例:
  using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text.RegularExpressions;
    
    /// <summary>
    ///HttpModel 的摘要说明
    /// </summary>
    public class HttpModule:IHttpModule
    {
            public void  Dispose()
            {
                throw new NotImplementedException();
            }
    
            public void  Init(HttpApplication context)
            {
                context.BeginRequest += new EventHandler(context_BeginRequest);//为BeginRequest事件注册方法
            }
    
            void context_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;//得到当前应用程序对象
                HttpContext context = application.Context; //得到当前请求的上下文
    
                string url =context.Request.Url.ToString(); //得到当前请求的假URL
                int lastindex = url.LastIndexOf('/'); //从最后一个/取索引
                string filename = url.Substring(lastindex);//得到文件名
                Regex reg = new Regex(@"(d+).aspx"); //创建正则对象,用来验证文件名是否满足条件
                if (reg.IsMatch(filename))
                {
                    Match match = reg.Match(filename);//创建Match对象
                    string id = match.Groups[1].Value;//通过正则结果对象,取到组()中数字的值(ID)
    
                    context.RewritePath("View.aspx?id=" + id);//通过指定的ID,重写真正存在的url地址
                }
    
            }
    }

  介绍完了,在asp.net中通过IHttpModule接口实现伪静态,有兴趣的朋友,亲自动手测试下吧,看看效果如何?!