我们经常看到很多网站访问文章的时候才用的是***.html或***.shtml (如本blog的日志访问效果),其实这种文件在服务器上并不存在,那为什么会出现这样的效果呢?是因为Web服务器上对URL执行了重写,把访问的 URL根据特定的格式重写成内部访问页面来实现的,它的好处是便于用户理解,同时搜索引擎也能更好地收入你的网站,当然其它的好处也很多,这里不做一一介绍了。

    本文所讲的是使用Asp.Net中的HttpHandler实现URL重写的,它所实现的原理请看这里

    IHttphandler是什么,表面上看他是一个接口,实际上他可以把客户端提交的请求进行处理后返回给客户端。

    IHttphandler接口包括IsReusable属性和ProcessRequest方法,IsReusable属性是指是否可以重用,ProcessRequest方法用来处理客户端的请求。

    首先来看下web.config里的配置信息:

    <httpHandlers>
        <add verb="*" path="cgi/*" type="MyHttpHandler.UrlChangeHandler,MyHttpHandler" />   

    </httpHandlers>


1)verb代表客户端请求类型,“*”代表任何请求类型,当然也可以是“GET,HEAD”,“POST,GET”等。


2)path代表客户端请求路径,这个很有用滴,服务器控件的响应可以利用,path设置为“cgi/*”其意义是如果客户端发出的路径请求,其中“*”代表任意字符串,比如:cgi/test,cgi /123456,cgi/redirectform?uid=pxl&pwd=123456等。

3)type顾名思义就是类了,格式为“[命名空间].[处理类名称],[命名空间]”,其中的处理类名称即为实现了IHttphandler接口的类的名词。


4)总的来说,此配置的意义为,客户端发出的verb类型为“*”的请求(任意类型请求) ,请求的路径格式为“cgi/*”,那么在服务器端会由UrlChangeHandler类进行处理。

Url重写的类可以写成Dll,当需要Url重写时将该Dll引入,并且在web.config进行配置即可实现。

 

下面我们来实现我们的处理类:


using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;

namespace MyHttpHandler
{
    
public class UrlChangeHandler : IHttpHandler
    {
        
#region IHttpHandler Members
        
public bool IsReusable
        {
            
get { return true; }
        }

        
public void ProcessRequest(HttpContext context)
        {
            
if (context.Request.Path.IndexOf("aspx"!= -1)
            {
                
return;
            }
            StringBuilder sbObj 
= new StringBuilder();
            sbObj.Append(context.Request.Path);
            sbObj.Append(
".aspx?");
            sbObj.Append(context.Request.QueryString.ToString());
            
string url = sbObj.ToString().Replace("cgi""handler");
            context.Server.Transfer(url, 
true);
        }
        
#endregion
    }
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-10-27
  • 2021-12-24
  • 2022-12-23
  • 2021-05-30
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-06-13
  • 2022-01-26
相关资源
相似解决方案