文档章节

不用组件的URL重写(适用于较大型项目)

深圳大道
 深圳大道
发布于 2016/12/29 15:40
字数 917
阅读 1
收藏 0

先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下:

<?xml version="1.0" encoding="utf-8"?>
<urls>  
  <rewrite name="Product"
      path="/Product-{0}.aspx"
      pattern = "/Product-(\d+).aspx"
      page="/Product.aspx"
      querystring="pid=$1" />
  <rewrite name="Article"
      path="/messages/{0}.html"
      pattern = "/messages/(\d+).html"
      page="/Article.aspx"
      querystring="aid=$1" />  
  <rewrite name="Product"
    path="/Product/{0}"
    pattern = "/Product/(\d+)"
    page="/Product.aspx"
    querystring="pid=$1" />
    
  <rewrite name="default"
      path="/default-{0}-{1}.aspx"
      pattern = "/default-(\d+)-(\d+)?.aspx"
      page="/default.aspx"
      querystring="id=$1^page=$2" /> 
</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))
                {
                    string newUrl = string.Empty;
                    //开始替换成我们程序能读懂的url    
                    if (GetContainCount(requestPath, "/") > 1)
                    {
                        newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.IndexOf("/")),
                                                url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase);
                    }
                    else
                    {
                        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);
                }
            }
        }


        /// <summary>
        /// 判断某个特定的字符 在一串值中出现的次数
        /// </summary>
        /// <param name="str"></param>
        /// <param name="symbol"></param>
        /// <returns></returns>
        private int GetContainCount(string str,string symbol)
        {
            char[] chars = str.ToCharArray();
            int Count = 0;
            foreach (char ch in chars)
            {
                if (ch.ToString().Equals(symbol))
                    Count++;
            }
            return Count;
        }
    }

    #region 
    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
    }
    #endregion
}

 


本文转载自:http://blog.csdn.net/smartsmile2012/article/details/8444286

共有 人打赏支持
深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
重提URL Rewrite(2):使用已有组件进行URL Rewrite

可能已经没有人会使用上一篇文章中的方法进行URL Rewrite了,因为提供URL Rewrite的组件早已铺天盖地了。   ASP.NET级别的URL Rewrite组件的原理很简单,其实只是监听BeginRequest事件,并...

jeffz
2008/01/13
0
0
Makefile之写demo时的通用Makefile写法总结

前面的一篇博文Makefile之大型工程项目子目录Makefile的一种通用写法介绍了大型项目子目录Makefile的一种通用写法,然而最近在写Linux网络方面的demo,一个目录下有几个文件,如果手工输命令显...

ustbgaofan
2014/08/15
0
0
Cross UI v1.3 发布,跨屏 UI 前端框架

跨屏网发布同名跨屏UI前端框架 CrossUI 1.3版本,它不算一个成熟的框架,但是对于学习有一定的借鉴作用,我们只是把公司业务需要的逻辑都整合成了一个框架式解决方案,它基于vue.js数据渲染,...

专注做前端
03/01
0
0
squid内存监控脚本

oomofsquid 用于监控服务器上的squid进程,保证对用户服务的稳定。 此进程意欲以守护进程模式运行,可以这样使用:./oomofsquid & 主要功能: 监控配置过的每个squid进程,保证它的内存占用看...

lzy821218
2013/02/19
0
0
开源多用户 O2O 商城系统--WSTMall

WSTMall 是一款 O2O 多用户网上商城系统,基于 ThinkPHP 开发。具有以下功能: 良好的缓存机制:WSTMall V1.0 支持包括文件方式、APC、Db、Memcache、Shmop、Eaccelerator 和 Xcache 在内的多...

B2B2C开源商城
2015/06/15
13K
7

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
11分钟前
2
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
1
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
3
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
8
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部