ASP.NET 路由实现页面静态化
页面静态化最大的好处是利于SEO,即使是伪静态,搜索引擎也会觉得这是一个较为友好的Url。Url的友好也取决于其命名,为一篇描述古代文学的页面起名用ancient-literature.html当然比随便起的名字例如aa.html之流要友好。页面静态化并不代表你一定要用后缀名为.html或.htm的链接来显示你的页面,你完全可以不用任何后缀名(就像MVC一样),只要Url结构良好。
实现静态化的三个目标:
1. 实现页面静态化,页面中的链接都用.html来表示,但每个.html实际都映射了一个.aspx页面。
例如:当用户请求index.html页面时,实际请求的是Default.aspx页面,index.html的物理路径在网站中并不存在。
2. 实现请求.aspx页面时自动跳转到对应的静态映射页面。
例如:当用户请求Default.aspx页面,自动跳重定向到index.html页面
3. 自定义404页面的实现
当请求的路径既不在映射表中,也不在网站的虚拟路径中时,它将自动跳转到我预先设定好的404页面。
实现以上要点,需要用到ASP.NET Url Routing、HttpHandler和HttpModule技术。
这是一个小系列的文章,这一篇文章将详细解释并实现第1点。
本文已经同步至我的个人博客站点:积累吧|ASP.NET 路由实现页面静态化
源代码下载:http://files.cnblogs.com/keepfool/UrlRouting.zip
在线Demo:http://csdemo.jileiba.com/UrlRouting/
一、项目创建
1. 创建一个ASP.NET Web Application项目
2. 创建web.config文件
ASP.NET Membership在这里使用不到,所以生成的web.config配置没有用处,删掉它并重新创建一个新的web.config文件
<?xml version="1.0"?> <configuration><system.web><compilation debug="true" targetFramework="4.0" /></system.web></configuration>
3. 将网站添加到IIS6或IIS7中
默认的ASP.NET Web Application已经为我们提供了不少页面,我就在下面的例子中将它们静态化吧。
二、页面静态化实现
1. 添加Routing引用
由于这里需要用到ASP.NET的路由映射(从.NET 3.5开始诞生),所以需要在项目中添加System.Web.Routing引用。
2. 添加WebHandler和WebModule文件夹
这两个文件夹分别用于存放IHttpHandler和IHttpModule。
3. 将所有.aspx后缀的超链接更改为.html
Site.Master文件:
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal"><Items><asp:MenuItem NavigateUrl="~/Index.html" Text="Home"/><asp:MenuItem NavigateUrl="~/About.html" Text="About"/></Items> </asp:Menu>
Account文件夹ChangePassword.aspx文件:
<asp:ChangePassword ID="ChangeUserPassword" runat="server" CancelDestinationPageUrl="~/" EnableViewState="false" RenderOuterTable="false"SuccessPageUrl="ChangePasswordSuccess.html">
当然现在这三个静态链接都访问不到,因为它们的物理地址不存在。
下面我们要做的就是:
1) 请求Index.html时实际请求的是Default.aspx
2) 请求About.html时实际请求的是About.aspx
3) 请求Account/Login.html时实际请求的是Account/Login.aspx
4. 添加自定义的IRouteHandler实现
using System.Web; using System.Web.Compilation; using System.Web.Routing; using System.Web.UI;namespace Routing_Static_Page_Demo.WebHandler {public class CustomRouteHandler : IRouteHandler{/// <summary>/// 虚拟路径/// </summary>public string VirtualPath { get; private set; }public CustomRouteHandler(string virtualPath){this.VirtualPath = virtualPath;}/// <summary>/// 返回实际请求页/// </summary>public IHttpHandler GetHttpHandler(RequestContext requestContext){var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;return page;}} }
5. 在Global.asax文件中注册路由
先来个简单的实现:
using System; using System.IO; using System.Web.Routing; using Routing_Static_Page_Demo.WebHandler;namespace Routing_Static_Page_Demo {public class Global : System.Web.HttpApplication{void Application_Start(object sender, EventArgs e){RegisterRoutes();}/// <summary>/// 注册路由/// </summary>private void RegisterRoutes(){//将Index.html请求映射为Default.aspxRouteTable.Routes.Add("Default",new Route("Index.html",new CustomRouteHandler("~/Default.aspx")));// 将About.html请求映射为About.aspxRouteTable.Routes.Add("About",new Route("About.html",new CustomRouteHandler("~/About.aspx")));// 将Account/Login.html请求映射为/Account/Login.aspxRouteTable.Routes.Add("Login",new Route("Account/Login.html",new CustomRouteHandler("~/Account/Login.aspx")));}} }
在VS中直接运行站点(VS自带的WebDev服务器),点击这些链接都能够正常访问。
三. 在IIS 7下设置站点
下面的设置很重要,因为上面在VS自带的web服务器中虽然跑通了,但IIS 7下是运行不通过的(IIS 6下的设置很简单,本文的在线Demo是运行在IIS 6下的)
1. 初次在IIS 7下运行该网站,会出现下面的错误。
这是因为IIS对该Web站点目录没有读写权限。
在IIS下:右键站点 > Edit Permissions > Security > Edit > Add > 输入IIS_IUSRS > Check Names > OK。
选择完毕后,为IIS_IUSRS用户添加Full Control权限。
border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML2f152df[4]" border="0" alt="SNAGHTML2f152df[4]" src="http://www.jileiba.com/wp-content/uploads/2012/03/SNAGHTML2f152df4_thumb.png" width="381" height="460" />
2. 添加完该设置后,再运行一次网站,可能会出现下面的错误。
按照上面的步骤添加IUSR用户,为IUSR用户分配Read权限即可。
再次运行网站,能够正常访问页面了。
3. 配置web.config
网站虽然能运行,但是点击Home或About链接时会出现404错误。
i. 首先确保在安装IIS时你已经勾选了HTTP Reirection
如果没有安装这个功能,按照如下设置再配置一遍IIS
Control Panel –> Progams –> Turn off windows features –> World wide web Services –> Common HTTP Features –> HTTP Redirection
ii. 修改web.config文件,在webserver中注册RoutingHandler和RoutingModule
<?xml version="1.0" encoding="UTF-8"?> <configuration><system.web><compilation debug="true" targetFramework="4.0" /></system.web><system.webServer><modules runAllManagedModulesForAllRequests="true"><remove name="UrlRoutingModule"/><add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /></modules><handlers><add name="UrlRoutingHandler"preCondition="integratedMode"verb="*" path="UrlRouting.axd"type="System.Web.HttpForbiddenHandler, System.Web,Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/></handlers></system.webServer></configuration>
注意: 如果你采用的是ASP.NET 3.5 Routing或使用IIS 6,web.config配置会不一样。
iii. 确保web站点的应用程序池选择的是集成模式,因为ASP.NET 4.0 Routing并不支持经典模式
OK,似乎所有的该配置的地方都配置了,那么再去点击Index.html或About.html链接试试吧。
如果现在去访问Login.html页面,还是会得到一个401.3的错误,更改Account目录下的web.config文件:
<?xml version="1.0"?> <configuration><location path="Register.aspx"><system.web><authorization><allow users="*"/></authorization></system.web></location><system.web><!--<authorization><deny users="?"/></authorization>--></system.web></configuration>
如果你不需要这个web.config文件,直接删掉也可以。
四. 更改RegisterRoutes方法
上面提供的注册路由的方式属于硬编码,需要为每一个.aspx页面指定映射路由。Account目录下还有一些.aspx文件,如果增加别的目录也存放.aspx页面,为了让每个页面都静态化,RegisterRoutes方法将会是产生很多重复代码。
using System; using System.IO; using System.Web.Routing; using Routing_Static_Page_Demo.WebHandler;namespace Routing_Static_Page_Demo {public class Global : System.Web.HttpApplication{void Application_Start(object sender, EventArgs e){RegisterRoutes();}/// <summary>/// 注册路由/// </summary>private void RegisterRoutes(){//将Index.html请求映射为Default.aspxRouteTable.Routes.Add("Default",new Route("Index.html",new CustomRouteHandler("~/Default.aspx")));// 将About.html请求映射为About.aspxRouteTable.Routes.Add("About",new Route("About.html",new CustomRouteHandler("~/About.aspx")));// 遍历页面存放目录,为每个.aspx页面添加路由映射foreach (string mapPth in _pageMapPath){string path = Server.MapPath(mapPth);var directoryInfo = new DirectoryInfo(path);foreach (FileInfo f in directoryInfo.GetFiles()){string fileName = f.Name;if (fileName.EndsWith(".aspx")){string routeName = fileName.Substring(0, fileName.Length - 5);string url = string.Concat(mapPth.Substring(2), routeName, ".html");RouteTable.Routes.Add(routeName,new Route(url,new CustomRouteHandler(string.Concat(mapPth, fileName))));}}}}// 页面存放目录private readonly string[] _pageMapPath = {@"~/Account/"};} }
以上代码就能实现为每个.aspx页面注册路由实现静态化。
ASP.NET 路由实现页面静态化相关推荐
- ASP.NET 权限管理 页面静态化 OA系统培训 三层架构
白菜价, 想要的联系QQ:867635458,非诚勿扰! ASP.NET MVC Linq 技术 企业级通用OA系统 全程开发 大型企业级别OA项目实战全新上线啦!本项目由小孔子讲师全程录制.小孔 ...
- 一步一步asp.net_页面静态化管理
最近事情多,中间还生病了一次,纠结,最近一年来都没有什么毛病,不知道咋了...头痛..... 今天闲下来写篇日志,页面静态化. 页面静态化是我们经常碰到的问题,在web中,要说速度,只有html静态页 ...
- asp.net 页面静态化
页面静态化,有三种方式 伪静态 真静态,折中法 现在我做的是折中发 创建一个asp.net 页面, 连接跳转到还未生成的页面 创建HttpHandle类 using System; using ...
- 利用ResultFilter实现asp.net mvc 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- 【转摘留用】页面静态化..
将asp.net页面静态化有很大意义,在些我就不多说了,实现asp.net页面静态化有很多种方面,在此我介绍一种在asp.net内实现的方法.大家都知道,每个asp.net页面都有一个特定的类对其进行 ...
- PHP如何实现HTML页面静态化
前言: 随着网站的内容的增多和用户访问量的增多,无可避免的是网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化. 一般情况下会 ...
- html静态化和动态页面,web动态页面静态化,伪静态
动态页面静态化 首选,我们需要了解两个概念, 静态页面 和 动态页面 静态页面 最早的时候,网站内容是通过在主机空间中放置大量的静态网页实现的 静态网页最大的缺点就是每个人看到的一样的. 以静态网页为 ...
- 网站页面静态化(一)初识
平日里,相信大多数人都有上网的习惯,而对于大型网站而言.最终呈现给用户的都是html页面,不论是纯静态还是伪静态,亦或者是动态生成.现如今的前端开发技术,不论是php.asp.jsp.vue.reac ...
- 页面静态化----------------------------------------个人笔记
***********************************************大型网站提速关键技术(页面静态化,mmecached,mysql优化)****************** ...
- 去静态化 php,PHP页面静态化 - 菜鸟要飞啊的IT小窝 - OSCHINA - 中文开源技术交流社区...
静态网页是服务器上面真实存在的页面,它不需要编译,用户就可以直接访问这样的网页,后缀一般为.html或者是.htm.如果我们把这个网页上传到我们的服务器或者是空间,那么它就可以通过直接访问我们的域名去 ...
最新文章
- 上下定高 中间自适应_联合首发|医药供应链平台一块医药获新一轮融资,赋能产业上下游提质增效...
- 最简实例说明wait、notify、notifyAll的使用方法
- SpringBoot 定制化原理
- 批量生成数组_JavaScript【重温基础】13.迭代器和生成器
- vue中通过js控制页面样式方法
- 运算符优先级 速查表
- 客户成功已死,客户服务还活着
- 力扣69-x的平方根(解决一个问题:我的答案和题解很像,但是为什么过不了?C++、Java版)
- SSH与EJB 比较
- 微信小程序在组件中关闭小程序
- java基础总结07-异常
- kali解压deb_Kali下安装网易云音乐
- seo好学吗?怎么学seo?
- C语言实现:素数的判断的多种方法
- php实现验证码(数字、字母、汉字)
- 模拟量输入输出模块的用途是什么?
- php开发环境搭建和基础入门
- java怎么开发图形界面_Java Swing 图形界面开发简介
- 图片上传到服务器,存储路径和查看图片的设置
- 计算机教学得意之处,看不懂没关系,知道厉害就行了:中科大俩教授11年解了两道数学难题...
热门文章
- 尚硅谷大数据Hadoop(1)技术之Hadoop(入门)
- php可视化网页制作软件,PHPRunner(PHP网页制作)官方版
- sci四区大水刊 计算机,sci一区水刊_十大水榜sci杂志_四大垃圾sci杂志
- J2EE(环境搭建)
- 基于python+boostrap的学校图书馆管理系统
- HttpUtil请求工具类
- 威纶通触摸屏232脚位_触摸屏通讯口(USB、RS232、RS422/485)的正确使用
- SourceTree git 工作流
- 标准商业计划书大纲模版
- 完整版彻底卸载SQL Server2019