Url重写告一段落,发布自己的源码和心得

嗯嗯,如果阅读了微软关于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。

你可能感兴趣的:(url重写)