分享
 
 
 

URL重写实现IHttpHandler接口

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

以前用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中,至于如何实现转换见下一页。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有