我们在开发网站的时候,会经常的用到get的方式来传值,这样,对我们来说,后台代码的实现是比较容易和方便的,但是,这种URL也会有相应的弊端,一个就是令我们经常头疼的Sql注入,一个是可以不利于SEO(搜索引擎优化)。而伪静态的技术就很好的解决了这一问题。
要想清楚地知道伪静态的技术,我们还是先来看看IHttpModule这个接口吧!
IHttpModule:向实现类提供模块化初始化和处理事件。相对于整个应用程序来讲,如果我们需要在请求发生之时对请求的地址进行处理就需要用到IhttpModule接口来实现伪静态技术,也就是将一个Get访问的查询字符串变成一个独立的文件,但是呢,在程序中实际上访问的还是查询字符串中的值。如http://www.myweb.com/news.aspx?id=1Http://www.myweb.com/news.aspx?id=1
改变为
http://www.myweb.com/news_1.aspx Http://www.myweb.com/news_1.aspx,这样,在外人看来就是一个单独的页面,而我们在实际用的时候还是用Get方式来传值的。
IHttpModule接口中有两个方法供我们实现:一个是Dispose,用来处置有实现IHttpModule的模块使用的资源(内存除外)。一个是Init,初始化模块,并使其为处理请求做好准备。而我们要实现伪静态的技术主要用的就是Init方法。
首先,我们需要在Web.config文件中,在节点system.web元素汇总添加一个httpModules的节点,如下:
<httpModules>
<add name="HttpModule" type="WebApplication1.HttpModule"/>
</httpModules>
注意:其中type,必须为实现了IHttpModule接口的类型的具体路径(如果有命名空间的话,前面要带命名空间)
接下来,我们就需要在App_Code中新建一个HttpModule类,如果有命名空间的话,就需要与配置文件中type的命名空间一致。然后要使该类实现IHttpModule接口。上面我们说到,这个接口中有两个方法供我们来使用。而我们要用到的就是Init方法,该方法中的HttpApplication对象context包括应用程序对象的所有方法、属性和事件。那么,我们就可以用这个context对象,创建一个请求的事件的委托方法。
具体代码如下:
void IHttpModule.Init(HttpApplication context)
{
//创建请求事件的委托
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication http = sender as HttpApplication;//得到整个应用程序对象
HttpContext context = http.Context;//得到请求http信息对象
string url = context.Request.RawUrl;//得到当前的请求内容
int start = url.LastIndexOf('/') + 1;
url = url.Substring(start);//得到路径中的文件名
//Default_1.aspx
Regex reg = new Regex(@"Main_(\d+).aspx");
Match match = reg.Match(url);//匹配项
if (reg.IsMatch(url))//验证是否正确
{
string id = match.Groups[1].Value;
context.RewritePath("Main.aspx?id=" + id);//重定向URL
}
//context.Response.Write(url);
}
其中,我们可以使用HttpContext对象的属性Request来获取当前请求。在得到当前请求后,可以使用正则表达式,从请求中获取所需的可变信息,用来重新定向到新的位置(这里用到了正则的分组,用小括号来实现,此时,我们要取的id是第一组)。然后,调用context中重定向的方法,即RewritePath(),可以将得到的新路径放到方法参数中。
这样,我们就完成了伪静态的全部实现,如果有多个页面都需要用伪静态这个技术来实现,那么 可以将正则表达式声明为一个数组来实现,具体的在这里就不多说了。