Url重写一劳永逸篇

时间:2023-01-06 19:58:41
  Url 重写可以提升用户体验,所以我们一直在追求,呵呵,先来一句广告语。 

我这里是用HttpHandlerFactory和在Web.config中添加一个配置节来实现重写的,举个例子先:
原始Urlabc.aspx?aid=121&bid=321&mid=9
重写Urlabc-121-321-9.shtml

原始Urlxyz.aspx?type=a 或者xyz.aspx?type=b
重写Urlxyz-a.shtml或者xyz-b.shtml

而且这里希望一劳永逸的实现Url参数类型千变万化的形式的重写。 

先看我们需要什么样的配置:
对于每一种重写我们都需要写出要重写成的Url的正则表达式的匹配形式,然后我们还需要配置原始Urlaspx路径,再就需要配置每一个参数在重写成的Url中怎么提取出来成为查询字符串,让原始的aspx去读取,说到这里,请看下面具体的配置节。

Url重写一劳永逸篇< configSections >
Url重写一劳永逸篇    
< section  name ="handlerSettings"  type ="book.Provider.ConfigHandler, book" />
Url重写一劳永逸篇  
</ configSections >
Url重写一劳永逸篇    
Url重写一劳永逸篇  
<!-- 配置Url路径重写参数,如有任何疑问联系赵玉开 -->
Url重写一劳永逸篇  
< handlerSettings >     
Url重写一劳永逸篇  
<!--
Url重写一劳永逸篇  一个handler代表一中url的映射
Url重写一劳永逸篇  regex是用来匹配Url的,如果匹配就使用对应的aspxPath中映射的handler
Url重写一劳永逸篇  aspxPath需要是一个可以经过Server.MapPath转换的aspx文件的虚拟路径
Url重写一劳永逸篇  params是在url中包含参数的设置
Url重写一劳永逸篇  param的两个属性:name是连接字符串的名字,valueRegexGroupName是正则表达式中匹配的对应名字的查询字符串的值的正则表达式组名字
Url重写一劳永逸篇  
-->
Url重写一劳永逸篇    
< handler  name ="news" >
Url重写一劳永逸篇        
< regex > /(? &lt; id &gt; [\d]+).shtml </ regex >
Url重写一劳永逸篇        
< aspxPath > detail.aspx </ aspxPath >
Url重写一劳永逸篇        
< params >
Url重写一劳永逸篇            
< param  name ="id"  valueRegexGroupName ="id" />
Url重写一劳永逸篇        
</ params >
Url重写一劳永逸篇    
</ handler >         
Url重写一劳永逸篇  
</ handlerSettings >

请大家看配置里面的注释。

有了配置节,我们就需要解析配置的类了,如下ConfigHandler用来读取配置节的信息,并将所有的配置信息实例化成ConfigItem 数组,然后放在这个类的一个静态数组中。

Url重写一劳永逸篇Url重写一劳永逸篇


解析出了重写的配置信息,我们的主角就该出场了,从IHttpHandlerFactory 继承的HanderFactory

Url重写一劳永逸篇Url重写一劳永逸篇HandlerFactory

 

我们只实现了接口的GetHandler方法首先我们需要逐个的用配置中的正则表达式去匹配传进来的Url,如果改配置项匹配了Url,那么就开始根据配置的参数项,提取url中的查询字符串的值,并组成一个查询字符串,需要注意的是查询字符串并不只是这一部分因为xxx.shtml还可能带有查询字符串的,所以我们还需要把这一部分的查询字符串附加到提取出来的查询字符串的后面,最后我们使用PageParser.GetCompiledPageInstance返回一个IHttpHandler的实例,到这儿基本上就结束了。 

当然我们还少不了要配置一下iis.net去处理指定扩展名的请求。配置Web.config中的httpHandlers配置节。 

不过由于iis的先天问题,我们在使用虚拟服务器的时候就没有办法用Url重写了,郁闷ing,大家有没有什么好办法?