asp.net 不用组件的URL重写(适用于较大型项目)
程序员文章站
2024-03-09 15:02:55
先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下:复制代码 代码如下:
先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下:
<?xml version="1.0" encoding="utf-8"?>
<urls>
<rewrite name="default"
path="/default-{0}-{1}.aspx"
pattern = "/default-(\d+)(-(\d+))?.aspx"
page="/default.aspx"
querystring="id=$1^page=$3" />
</urls>
我这里只写了一种规则,然后修改网站的web.config文件,修改后的代码为:
<?xml version="1.0"?>
<configuration>
<appsettings/>
<connectionstrings/>
<system.web>
<authentication mode="windows"/>
<httpmodules>
<add type="my.forum.httpmodule" name="httpmodule"/>
</httpmodules>
<compilation debug="true"/>
</system.web>
<!--
在 internet 信息服务 7.0 下运行 asp.net ajax 需要 system.webserver
节。对早期版本的 iis 来说则不需要此节。
-->
<system.webserver>
<validation validateintegratedmodeconfiguration="false"/>
<modules>
<add type="my.forum.httpmodule" name="httpmodule"/>
</modules>
</system.webserver>
</configuration>
本来只写一个
<httpmodules>
<add type="my.forum.httpmodule" name="httpmodule"/>
</httpmodules>
就可以了,我这里写了两个主要是为了演示如何兼容iis7 ,然后在解决方案下新建一个项目(类库),起什么名字无所谓,主要是这个项目下一定要有一个命名空间为my.forum的类文件。
具体代码我贴出来 详细的解释我都写在注释里了。
//用到的命名空间
using system;
using system.diagnostics;
using system.threading;
using system.web;
using system.xml;
using system.text.regularexpressions;
using system.io;
//注意名称空间
namespace my.forum
{
//继承自ihttpmodule接口
public class httpmodule : system.web.ihttpmodule
{
/// <summary>
/// 实现接口的init方法
/// </summary>
/// <param name="context"></param>
public void init(httpapplication context)
{
//建立个委托让他执行下面的reurl_beginrequest事件
context.beginrequest += new eventhandler(reurl_beginrequest);
}
/// <summary>
/// 实现接口的dispose方法
/// </summary>
public void dispose()
{
}
private void reurl_beginrequest(object sender, eventargs e)
{
httpcontext context = ((httpapplication) sender).context;
string requestpath = context.request.path.tolower();
//siteurls是下面的一个类,这里大家可以重构下
foreach (siteurls.urlrewrite url in siteurls.getsiteurls().urls)
{
//是否找到了匹配选项
if (regex.ismatch(requestpath, url.pattern, regexoptions.none | regexoptions.ignorecase))
{
//开始替换成我们程序能读懂的url
string newurl = regex.replace(requestpath.substring(context.request.path.lastindexof("/")),
url.pattern, url.querystring, regexoptions.none | regexoptions.ignorecase);
//这里你可以输出一下看看
//context.response.write(url.page + "<br>" + newurl+"<br>");
//开始把用户便于记忆的url替换成程序能读懂的url
context.rewritepath(url.page, string.empty, newurl);
}
}
}
}
public class siteurls
{
//定义成volatitle类型主要是为了多线程访问方便,在这个示例程序中没什么实际意义,项目大了就有用了
private static volatile siteurls instance = null;
string urlsfile = httpcontext.current.server.mappath("/config/urls.config");
//定义两个属性
private system.collections.arraylist _urls;
public system.collections.arraylist urls
{
get { return _urls; }
set { _urls = value; }
}
//这个就是个键植对 表害怕一点也不高深
private system.collections.specialized.namevaluecollection _paths;
public system.collections.specialized.namevaluecollection paths
{
get { return _paths; }
set { _paths = value; }
}
//构造函数
private siteurls()
{
urls = new system.collections.arraylist();
paths = new system.collections.specialized.namevaluecollection();
//以xml个数读取那config文件
xmldocument urlconfig = new xmldocument();
urlconfig.load(urlsfile);
xmlnode root = urlconfig.selectsinglenode("urls");
foreach (xmlnode n in root.childnodes)
{
//xmlnodetype.comment如果不是注释
if (n.nodetype != xmlnodetype.comment && n.name.tolower() == "rewrite")
{
xmlattribute name = n.attributes["name"];
xmlattribute path = n.attributes["path"];
xmlattribute page = n.attributes["page"];
xmlattribute querystring = n.attributes["querystring"];
xmlattribute pattern = n.attributes["pattern"];
if (name != null && path != null && page != null
&& querystring != null && pattern != null)
{
paths.add(name.value, path.value);
//压进去的都是url实体类
urls.add(new urlrewrite(name.value, pattern.value, page.value.replace("^", "&"),
querystring.value.replace("^", "&")));
}
}
}
}
//用方法实例化
public static siteurls getsiteurls()
{
if (instance == null)
{
instance = new siteurls();
}
return instance;
}
#region url实体类
public class urlrewrite
{
#region 成员变量
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
private string _pattern;
public string pattern
{
get { return _pattern; }
set { _pattern = value; }
}
private string _page;
public string page
{
get { return _page; }
set { _page = value; }
}
private string _querystring;
public string querystring
{
get { return _querystring; }
set { _querystring = value; }
}
#endregion
#region 构造函数
public urlrewrite(string name, string pattern, string page, string querystring)
{
_name = name;
_pattern = pattern;
_page = page;
_querystring = querystring;
}
#endregion
}
#endregion
}
}
复制代码 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<urls>
<rewrite name="default"
path="/default-{0}-{1}.aspx"
pattern = "/default-(\d+)(-(\d+))?.aspx"
page="/default.aspx"
querystring="id=$1^page=$3" />
</urls>
我这里只写了一种规则,然后修改网站的web.config文件,修改后的代码为:
复制代码 代码如下:
<?xml version="1.0"?>
<configuration>
<appsettings/>
<connectionstrings/>
<system.web>
<authentication mode="windows"/>
<httpmodules>
<add type="my.forum.httpmodule" name="httpmodule"/>
</httpmodules>
<compilation debug="true"/>
</system.web>
<!--
在 internet 信息服务 7.0 下运行 asp.net ajax 需要 system.webserver
节。对早期版本的 iis 来说则不需要此节。
-->
<system.webserver>
<validation validateintegratedmodeconfiguration="false"/>
<modules>
<add type="my.forum.httpmodule" name="httpmodule"/>
</modules>
</system.webserver>
</configuration>
本来只写一个
复制代码 代码如下:
<httpmodules>
<add type="my.forum.httpmodule" name="httpmodule"/>
</httpmodules>
就可以了,我这里写了两个主要是为了演示如何兼容iis7 ,然后在解决方案下新建一个项目(类库),起什么名字无所谓,主要是这个项目下一定要有一个命名空间为my.forum的类文件。
具体代码我贴出来 详细的解释我都写在注释里了。
复制代码 代码如下:
//用到的命名空间
using system;
using system.diagnostics;
using system.threading;
using system.web;
using system.xml;
using system.text.regularexpressions;
using system.io;
//注意名称空间
namespace my.forum
{
//继承自ihttpmodule接口
public class httpmodule : system.web.ihttpmodule
{
/// <summary>
/// 实现接口的init方法
/// </summary>
/// <param name="context"></param>
public void init(httpapplication context)
{
//建立个委托让他执行下面的reurl_beginrequest事件
context.beginrequest += new eventhandler(reurl_beginrequest);
}
/// <summary>
/// 实现接口的dispose方法
/// </summary>
public void dispose()
{
}
private void reurl_beginrequest(object sender, eventargs e)
{
httpcontext context = ((httpapplication) sender).context;
string requestpath = context.request.path.tolower();
//siteurls是下面的一个类,这里大家可以重构下
foreach (siteurls.urlrewrite url in siteurls.getsiteurls().urls)
{
//是否找到了匹配选项
if (regex.ismatch(requestpath, url.pattern, regexoptions.none | regexoptions.ignorecase))
{
//开始替换成我们程序能读懂的url
string newurl = regex.replace(requestpath.substring(context.request.path.lastindexof("/")),
url.pattern, url.querystring, regexoptions.none | regexoptions.ignorecase);
//这里你可以输出一下看看
//context.response.write(url.page + "<br>" + newurl+"<br>");
//开始把用户便于记忆的url替换成程序能读懂的url
context.rewritepath(url.page, string.empty, newurl);
}
}
}
}
public class siteurls
{
//定义成volatitle类型主要是为了多线程访问方便,在这个示例程序中没什么实际意义,项目大了就有用了
private static volatile siteurls instance = null;
string urlsfile = httpcontext.current.server.mappath("/config/urls.config");
//定义两个属性
private system.collections.arraylist _urls;
public system.collections.arraylist urls
{
get { return _urls; }
set { _urls = value; }
}
//这个就是个键植对 表害怕一点也不高深
private system.collections.specialized.namevaluecollection _paths;
public system.collections.specialized.namevaluecollection paths
{
get { return _paths; }
set { _paths = value; }
}
//构造函数
private siteurls()
{
urls = new system.collections.arraylist();
paths = new system.collections.specialized.namevaluecollection();
//以xml个数读取那config文件
xmldocument urlconfig = new xmldocument();
urlconfig.load(urlsfile);
xmlnode root = urlconfig.selectsinglenode("urls");
foreach (xmlnode n in root.childnodes)
{
//xmlnodetype.comment如果不是注释
if (n.nodetype != xmlnodetype.comment && n.name.tolower() == "rewrite")
{
xmlattribute name = n.attributes["name"];
xmlattribute path = n.attributes["path"];
xmlattribute page = n.attributes["page"];
xmlattribute querystring = n.attributes["querystring"];
xmlattribute pattern = n.attributes["pattern"];
if (name != null && path != null && page != null
&& querystring != null && pattern != null)
{
paths.add(name.value, path.value);
//压进去的都是url实体类
urls.add(new urlrewrite(name.value, pattern.value, page.value.replace("^", "&"),
querystring.value.replace("^", "&")));
}
}
}
}
//用方法实例化
public static siteurls getsiteurls()
{
if (instance == null)
{
instance = new siteurls();
}
return instance;
}
#region url实体类
public class urlrewrite
{
#region 成员变量
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
private string _pattern;
public string pattern
{
get { return _pattern; }
set { _pattern = value; }
}
private string _page;
public string page
{
get { return _page; }
set { _page = value; }
}
private string _querystring;
public string querystring
{
get { return _querystring; }
set { _querystring = value; }
}
#endregion
#region 构造函数
public urlrewrite(string name, string pattern, string page, string querystring)
{
_name = name;
_pattern = pattern;
_page = page;
_querystring = querystring;
}
#endregion
}
#endregion
}
}