不用组件的URL重写(适用于较大型项目)
来源:互联网 发布:淘宝店铺客服怎么应聘 编辑:程序博客网 时间:2024/06/06 13:09
先在网站根目录下建立一个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}
- 不用组件的URL重写(适用于较大型项目)
- asp.net 不用组件的URL重写(适用于较大型项目)
- url重写,UrlReWrite组件
- 使用Retrofit2封装适用于组件化项目的网络库
- 使用Retrofit2封装适用于组件化项目的网络库
- UrlRewriter 是微软封装好了的一个URL重写组件
- URL重写组件UrlRewriter 在Windows XP下的运用
- UrlRewriter 是微软封装好了的一个URL重写组件
- 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis
- 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis
- 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis
- 分布式架构真正适用于大型互联网项目的架构 dubbo+zookeeper+springmvc+mybatis+shiro+redis
- nginx pathinfo配置,适用于较高版本的nginx
- url重写的心得
- DokuWiki的URL重写
- 简单URL的重写
- URL重写--我认为的
- prettyfaces的 URL重写
- ASP.NET缓存全解析3:页面局部缓存
- 【Linux Shell】shell命令读书笔记---第六章:使用循环进行流控制
- Zookeeper 快速理解
- 《UNIX环境高级编程》APUE源码使用方法
- ASP.NET缓存全解析4:应用程序数据缓存
- 不用组件的URL重写(适用于较大型项目)
- freemarker的数据格式化
- Sicily.1046. Plane Spotting(排序)
- Clojure语言四:解析XML
- ASP.NET缓存全解析5:文件缓存依赖
- 大学C++总结
- servlet学习
- Console命令详解,让调试js代码变得更简单
- error LNK2005: _DllMain@12 already defined