asp.net利用自定义Http处理程序实现URL伪静态之初探

来源:互联网 发布:淘宝店铺运营分析报告 编辑:程序博客网 时间:2024/06/05 02:48

之前在做过的一个项目中,也实现了伪静态URL页面的办法,不过那是利用URLRewriter.dll并需要通过配置IIS才得以实现,而且通过这个方法实现还有不少要求,但在实际过程中,服务器我们是买别人家公司的,并不能实现登录虚拟机进行配置IIS,甚至如果服务器供应商都不提供有支持.framework 4.0,那这实现又从何说起?!


    近日看了一些HTTP管道的文章,看了上面的例子,突然想到,既然asp.net请求是通过Http管道来处理的,那为何不用它来实现伪静态化呢?于是就动手写了一个例子,发现结果还是可以的,所以拿出来分享一下:


    实现自定义的Http管道处理程序我们需要自己定义一个继承IHttpHandler接口的类,主要实现一个方法跟一个属性,例如,我定义了一个Redir类:


<pre name="code" class="csharp">public class Redir :IHttpHandler    {        /// <summary>        /// 当有重复的请求时,是否重用这个资源对象        /// </summary>        public bool IsReusable        {            get            {                return true;            }        }        /// <summary>        /// 请求进程处理        /// </summary>        /// <param name="context"></param>        public void ProcessRequest( HttpContext context )        {            string RawUrl = context.Request.RawUrl; //获取当前请求原始URL            //因为后缀为.html或是.shtml和.htm,我们需要进行截取并根据'-'进行分段,以便获得参数值            string[] Paras = RawUrl.Substring( 0, RawUrl.IndexOf( '.' ) ).Split( new char[] { '-', '/' }, StringSplitOptions.RemoveEmptyEntries );            string RebulidParas = "";            //根据获得参数的数量进行相应的处理            switch ( Paras.Length )            {                case 2:                    RebulidParas = "?name=" + Paras[1];                    break;                case 3:                    RebulidParas = "?name=" + Paras[1] + "&id=" + Paras[2];                    break;                default:                    break;            }            //然后在服务器内部进行重新发送这个转化过的url,注意后缀恢复成了原来的.aspx,            context.Server.Transfer( Paras[0] +".aspx" + RebulidParas  );        }    }


然后在Web.Config文件中进行注册这个HttpHandler

<system.web><httpHandlers><add verb="*" path="*.shtml" type="空间名.类名,程序集名"/></httpHandlers></system.web>


这个类其实处理过程很简单:

    就是当有一个后缀不为.aspx的请求发送到这个HttpHandler后,假设有一个请求如下:http://www.***.com/Article-dpan-20.shtml

    这个请求发送过来,能过上下文对象中的Request.RawUrl我们可以得到一个原始请求:/Article-dpan-20.shtml

    后缀部份,我们不要,进行截尾处理变成/Article-dpan-20。然后我们需要做的就是根据'-'分隔的参数值获取出来,所以通过String.Split方法,分割成了:

(1)/Article

(2)dpan

(3)20

   剩下的工作就好做了,重新进行拼接起来就行了,所以变成了,/Article.aspx?name=dpan&id=20。通过内部转移Transfer方法将这个URL发送给对应的指定页面就OK了。


   这种重写的方法显然没有那种 /Article/dpan/20.html 这种形式来得优雅,我也尝试着进行转化处理,发现有几个问题没办法处理:

   (1)因为网站后台使用的是在线的HTML编辑器,这种编辑器会有自带的生成的.html页面,如果后缀使用了.html来进行伪静态,导致后台HTML编辑器无法正常使用。

   (2)在注册httpHandlers中的path属性,并不能认可像 /Article/*/*.shtml 这种形式的路径请求,个人猜测是在WindowForm开发下,文件映射的问题吧,具体的还没有仔细研究过,也对Web.Config研究不深,还需仔细去找资料查看看。

   

    目前通过这种形式来实现伪静态化也算是能满足一些需求吧,因为之前的网站,要不是客户自己买有云服务器,可以登录上去进行配置IIS,我都不知道如何在我们自己服务器供应商提供的只支持.framework 3.5而且也不准配置IIS这种情况下实现伪静态化了,现在通过这个自定义的扩展Http程序,也算是可以做到了。

    

   但我有找到很多人介绍说通过HttpModules截获Http请求进行处理,而且HttpModules是可以调用好几个的的,而HttpHandles只能调用一个。具体的还没有去研究过,接下来又有得忙啦!




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕后不想要该怎么办 20多岁雌激素低怎么办 生完小孩后子宫下垂怎么办 取环之前同房了怎么办 做人流后又怀孕怎么办 仓鼠长了个肿瘤怎么办 过敏留下的黑印怎么办 脸上痘痘发炎了怎么办 脸上皮肤红痒怎么办啊 皮肤有一片红痒怎么办 脸过敏期间很干怎么办 怀孕了用了消糜栓怎么办 乳酸杆菌少或无怎么办 怀孕了白带有异味怎么办 怀孕清洁度iv度怎么办 怀孕了下面有异味怎么办 孕妇尿白细胞1是怎么办 药流期间喂奶了怎么办 20多岁卵巢早衰怎么办 3岁儿童肚子胀气怎么办 肚子又胀又痛怎么办 1岁宝宝肚子胀气怎么办 2岁宝宝肚子胀气怎么办 产后腰粗肚子大怎么办 发烧后腹泻拉水怎么办 又吐又拉还发烧怎么办 喝中药恶心想吐怎么办 生完孩子肛门疼怎么办 拉完大便肛门痛怎么办 肚子总是凉凉的怎么办 京东金条风控了怎么办 京东维修没发票怎么办 假牙吞到肚子里怎么办 眼睛一只大一只小怎么办 一个眼睛大一个眼睛小怎么办 电脑上的字模糊怎么办 无忧乐行注销了怎么办 连供墨盒有空气怎么办 30岁突然停经了怎么办 下面很痒怎么办白带多 私处有点痒怎么办洗液