URL重写实现IHttpHandler接口
发布时间:2006-06-22 11:42:43 来源:天极网 网友评论 0 条以前用url重写时是用的ms urlrewriter,用了以后发现了很多不足,自定义功能太弱,而且随着重写规则的增加,web.config可能会越来越大,实际上,url重写就是实现IHttpHandler接口.
整个流程分二步走:
1、用一个xml文件来存储重写规则,其中这些规则是一些简单的正则表达式
2、实现IHttpHandler接口
首先看一下xml文件的格式:
| 以下是引用片段: <?xml version="1.0" encoding="utf-8" ?> <root> <regex> <!--重写以后的虚拟地址--> <b><![CDATA[xxx,(?<id>[0-9]+).html$]]></b> <!--实际地址--> <a><![CDATA[xxx.aspx?id=${id}]]></a> </regex> </root> |
相信上面的xml大家都能看懂.
| 以下是引用片段: using System; using System.IO; using System.Data; using System.Configuration; using System.Collections.Generic; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Text; using System.Text.RegularExpressions; using Microsoft.VisualBasic; //RegexInfo结构,用来存储从xml文件中读取到的数据 public struct RegexInfo { public string _before; public string _after; public RegexInfo(string before, string after) { _before = before.ToLower(); _after = after.ToLower(); } } //ipFilter结构,用来存储被封的IP public struct ipFilter { public string _ip; public ipFilter(string ip) { _ip = ip; } } public class HtmlHttpHandler : IHttpHandler //实现IHttpHandler接口 { private List<RegexInfo> _regex_list = new List<RegexInfo>(); private List<ipFilter> _ip_filter = new List<ipFilter>(); public HtmlHttpHandler() { DataSet ds = new DataSet(); //读取url重写规则文件,并写入RegexInfo结构的实例中 ds.ReadXml(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Regexs.xml")); foreach (DataRow r in ds.Tables["regex"].Rows) _regex_list.Add(new RegexInfo(((string)r["b"]).Trim(), ((string)r["a"]).Trim())); ds.Reset(); //读取被封的IP列表 ds.ReadXml(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/ipFilter.xml")); foreach(DataRow r in ds.Tables["IpFilters"].Rows) _ip_filter.Add(new ipFilter((string)r["ip"])); } public void ProcessRequest(HttpContext context) { string _ip = context.Request.UserHostAddress; //获取IP foreach (ipFilter r in _ip_filter) { if (_ip == r._ip) { context.Response.Write("对不起,您的IP:"+_ip+"已被限制!"); context.Response.End(); } } string path = context.Request.Path.ToLower(); //获取当前访问的重写过的虚假URL foreach (RegexInfo r in _regex_list) path = Regex.Replace(path, r._before, r._after); //匹配出其真实的URL context.Server.Execute(path); } // Override the IsReusable property. public bool IsReusable { get { return true; } } } |
OK,IHttpHandler接口就被实现了,下面稍配一下web.config就可以实现URL重写了
在web.config的<system.web></system.web>中加入 :
| 以下是引用片段: <httpHandlers> <add verb="*" path="*.html" type="HtmlHttpHandler"/> </httpHandlers> |
表示后缀名为.html的文件全部交给HtmlhttpHandler类去处理,最后配一下iis就行了。
至于简繁的转换,你可以加到ProcessRequest中,至于如何实现转换见下一页。
- 推荐阅讯
- CSS解决未知高度的DIV垂直居中
- CSS的“顶级技巧”
- CSS初级入门:样式表的外部调用
- CSS:超越网格的布局
- CSS实现当前页的滑动门菜单效果方法
- 使用纯 CSS 设计3D按钮
- 玩转表格 让你的网页炫起来
- CSS入门教程之CSS的语法
- CSS初级入门:样式的单独调用
- 网页制作基础技巧 框架(帧窗口)间的交互
- 阅读排行
- 1.如何使用CSS来进行网页排版
- 2.CSS样式表教程-If you love css …
- 3.CSS用样式表美化你的网页
- 4.网页制作:几种所见所得的WEB在线编辑器
- 5.网页常见可用性错误——表单组件错误
- 6.CSS+JavaScript打造超酷右键菜单
- 7.针对浏览器隐藏CSS之九大技巧
- 8.DIV+CSS网页布局入门
- 9.搜索引擎的蜘蛛人(ROBOTS)秘密
- 10.CSS垂直树形下拉菜单
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
