我这里是用HttpHandlerFactory和在Web.config中添加一个配置节来实现重写的,举个例子先:
原始Url:abc.aspx?aid=121&bid=321&mid=9
重写Url:abc-121-321-9.shtml
原始Url:xyz.aspx?type=a 或者xyz.aspx?type=b
重写Url:xyz-a.shtml或者xyz-b.shtml
而且这里希望一劳永逸的实现Url参数类型千变万化的形式的重写。
先看我们需要什么样的配置:
对于每一种重写我们都需要写出要重写成的Url的正则表达式的匹配形式,然后我们还需要配置原始Url的aspx路径,再就需要配置每一个参数在重写成的Url中怎么提取出来成为查询字符串,让原始的aspx去读取,说到这里,请看下面具体的配置节。
请大家看配置里面的注释。
有了配置节,我们就需要解析配置的类了,如下ConfigHandler用来读取配置节的信息,并将所有的配置信息实例化成ConfigItem 数组,然后放在这个类的一个静态数组中。
解析出了重写的配置信息,我们的主角就该出场了,从IHttpHandlerFactory 继承的HanderFactory类
我们只实现了接口的GetHandler方法首先我们需要逐个的用配置中的正则表达式去匹配传进来的Url,如果改配置项匹配了Url,那么就开始根据配置的参数项,提取url中的查询字符串的值,并组成一个查询字符串,需要注意的是查询字符串并不只是这一部分因为xxx.shtml还可能带有查询字符串的,所以我们还需要把这一部分的查询字符串附加到提取出来的查询字符串的后面,最后我们使用PageParser.GetCompiledPageInstance返回一个IHttpHandler的实例,到这儿基本上就结束了。
<handler name="book">
<regex>/book/(?<id>[\d]+).shtml</regex>
<aspxPath>../book.aspx</aspxPath>
<params>
<param name="id" valueRegexGroupName="id"/>
</params>
</handler> 回复 更多评论