今天在网上找了一个处理URL重写的例子,原理使用Asp.Net中的HttpHandler实现URL重写的,当URL的后缀是XXX.shtml,而且XXX必须是数字的时候进行处理:
using System;
using System.Web;
using System.Text.RegularExpressions;
namespace test
{
public class NewHttpHandler:IHttpHandler
{
public void ProcessRequest(HttpContext Context)
{
try
{
//申明Request
HttpRequest Request = Context.Request;
//取来路Url的绝对路径
string Url = Request.Url.AbsolutePath;
//取访问的Web文件的开始字符间隔数
int RegStart = Url.LastIndexOf("/") + 1;
//申明一个确定Web文件名是否全是数字
Regex Reg = new Regex(@"\d+");
//用正则表达式进行匹配
if (Reg.IsMatch(Url, RegStart))
{
//如果web文件名是数字,则判定是查询相关文章,执行指定页面
Context.Server.Execute("~/PermaLink.aspx?id=" + Reg.Match(Url, RegStart).Value);
}
}
catch
{
Context.Response.Redirect(Context.Request.Url.ToString());
}
}
/// <summary>
/// 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。
/// </summary>
public bool IsReusable
{
get
{
return true;
}
}
}
}
using System.Web;
using System.Text.RegularExpressions;
namespace test
{
public class NewHttpHandler:IHttpHandler
{
public void ProcessRequest(HttpContext Context)
{
try
{
//申明Request
HttpRequest Request = Context.Request;
//取来路Url的绝对路径
string Url = Request.Url.AbsolutePath;
//取访问的Web文件的开始字符间隔数
int RegStart = Url.LastIndexOf("/") + 1;
//申明一个确定Web文件名是否全是数字
Regex Reg = new Regex(@"\d+");
//用正则表达式进行匹配
if (Reg.IsMatch(Url, RegStart))
{
//如果web文件名是数字,则判定是查询相关文章,执行指定页面
Context.Server.Execute("~/PermaLink.aspx?id=" + Reg.Match(Url, RegStart).Value);
}
}
catch
{
Context.Response.Redirect(Context.Request.Url.ToString());
}
}
/// <summary>
/// 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。
/// </summary>
public bool IsReusable
{
get
{
return true;
}
}
}
}
然后是配置web.config的 <httpHandlers>节点:
<httpHandlers>
<add verb="*" path="*.shtml" type="test.NewHttpHandler,test" />
</httpHandlers>
<add verb="*" path="*.shtml" type="test.NewHttpHandler,test" />
</httpHandlers>
接着配置IIS,刚刚开始的时候怎么也不能得到结果,郁闷……
最后发配置时的两个问题:
1.<httpHandlers>节点的写法:type="处理HttpHander的类的完全名称即命名空间+类名,程序集名称"
2.IIS中在Web项目的属性中,在主目录选项卡里,把执行权限改为"脚本和可执行文件",然后打开配置,*.shtml默认情况下处理程序是C:\WINDOWS\system32\inetsrv\ssinc.dll,如果要让ASP.net处理应改为C:\WINDOWS\system32\inetsrv\ssinc.dll,去掉检查文件是否存在的复选框
3.如果要改其他扩展名也是一样的道理,注意上面两个问题就是了