嗯嗯,如果阅读了微软关于Url重写的文章的话,对其工作原理有了了解之后,其实实现URL是比较容易的。主要是Web.config,globa..asax和逻辑类三个主要部分组成:
首先要做的是在Web.config中添加元素标签,以便让逻辑类识别
其次编写类文件,实现重写
最后在globa.asax中的beginrequest事件中添加执行代码。
说起容易,看看我的做法
Web.config:
<configuration>
<configSections>
<sectionGroup name="system.web">
<section name="urlrewrites" type="UrlRewrite.Rewriter,UrlRewrite,Version=1.0.783.30976,Culture=neutral, PublicKeyToken=" />
</sectionGroup>
</configSections>
</configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro" />
</httpHandlers>
<urlrewrites>
<rule>
<url>/NetBesttone/Iask/(.*)\.html</url>
<rewrite>Ask_answer.aspx?sendaskid=$1</rewrite>
</rule>
</urlrewrites>
</system.web>
UrlRewrite.cs:
using System;
using System.Web;
using System.Xml;
using System.Xml.XPath;
using System.Configuration;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
using System.Xml.Xsl;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace UrlRewrite
{
public class Rewriter : IConfigurationSectionHandler
{//派生类,实现Create()接口
protected XmlNode _oRules=null;
protected Rewriter(){}
public string GetSubstitution(string zPath)
{//循环Web.Config中<rule>标签中匹配的的内容,规则在Web.Config中添加
Regex oReg;
foreach(XmlNode oNode in _oRules.SelectNodes("rule"))
{
oReg=new Regex(oNode.SelectSingleNode("url/text()").Value);
Match oMatch=oReg.Match(zPath);
if(oMatch.Success)
{
return oReg.Replace(zPath,oNode.SelectSingleNode("rewrite/text()").Value);//Web.Config中标签名为"rewrite"
}
}
return zPath;
}
public static void Process()
{
Rewriter oRewriter=(Rewriter)ConfigurationSettings.GetConfig("system.web/urlrewrites");
string zSubst=oRewriter.GetSubstitution(HttpContext.Current.Request.Path);
if(zSubst.Length>0)
{
HttpContext.Current.RewritePath(zSubst);//利用系统重写方法进行重写
}
}
public object Create(object parent, object configContext, XmlNode section)
{
_oRules=section;
// TODO: Compile all Regular Expressions
return this;
}
}
}
globa.asax:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
UrlRewrite.Rewriter.Process();
}
这三个文件在一个解决方案里也许会有问题,就是web.config中的dll找不到应用程序,所以,解决办法是:新建一个asp.net应用程序项目,只新建立UrlRewrite.cs一个文件,之后生成UrlRewrite.dll文件。再在之前的解决方案里添加引用即可。这样做的目的当然是使其组件话。
Plus:如果像我一样web.config的重写规则用的扩展名是.html的话,你最后检查你的虚拟目录或者站点目录的iis应用程序配置里是否已将该扩展名映射到isapi.dll文件,如果没有,则会找不到被映射的实际url。