页面静态化最大的好处是利于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.aspx
RouteTable.Routes.Add("Default",
new Route("Index.html",
new CustomRouteHandler("~/Default.aspx")));
// 将About.html请求映射为About.aspx
RouteTable.Routes.Add("About",
new Route("About.html",
new CustomRouteHandler("~/About.aspx")));
// 将Account/Login.html请求映射为/Account/Login.aspx
RouteTable.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.aspx
RouteTable.Routes.Add("Default",
new Route("Index.html",
new CustomRouteHandler("~/Default.aspx")));
// 将About.html请求映射为About.aspx
RouteTable.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实现伪静态,下载了这个dll添加引用后,在WEB。conf中配置一些就实现了,很不错的袄
路由的功能是为了让所有Asp.net网站开发都可以使用,所以dll并没有在MVC中,而是在System.Web中的System.web.Routing。 现在我们为了我们实际的需求,实现MVC3中的自定义路由功能(继承RouteBase,重写RouteData和...
ASP.NET下为静态的实现方法。
目录 第一篇 .NET基础 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET ...17.4.5 ASP.NET MVC URL路由(URLRouting) 17.4.6 ASP.NET MVC控件辅助工具(Helper) 17.4.7 ASP.NET MVC表单传值 17.5 小结 第18章 ...
17.4.5 ASP.NET MVC URL 路由(URLRouting) 17.4.6 ASP.NET MVC 控件辅助工具(Helper) 17.4.7 ASP.NET MVC 表单传值 17.5 小结 第 18 章 WCF 开发基础 20 第一篇 窗口与界面编程 18.1 了解WCF 18.1.1 什么是WCF ...
ASP.NET MVC4通过UrlRewriter配置伪静态,在网上都有很多资料,这里主要是把项目中使用到的通过UrlRewriter配置伪静态提取出来,方便自己以后查看,同样对需要该功能的网友提供思路。
要解决这个问题,我们需要先了解ASP.NET应用程序的生命周期,先看下面作者整理的一张图片: 从图中我们可以清楚的看到:通用IIS访问应用程序时,每次的单个页面URL访问时,都会先经过HttpApplication 管线处理请求...
这是整部学习资料 由于太大第一章免费供应给大家 在我的上传资源中 如果觉得还不过希望大家给个好评 当然具体本书的作者就不深究了把! 第1章 认识ASP.NET 3.5 ...17.4.5 ASP.NET MVC URL路由(URLRouting)...
页面静态化有许多方式,最常见的就是类似很多PHP CMS种使用的 标签替换的方式(如:帝国CMS、EcShop等),还有很多都是伪静态,伪静态我们就不做过多解释,通过路由或Url重写来实现就可以了。Razor为我们提供了更加...
目录 第一篇 .NET基础 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET ...17.4.5 ASP.NET MVC URL路由(URLRouting) 17.4.6 ASP.NET MVC控件辅助工具(Helper) 17.4.7 ASP.NET MVC表单传值 17.5 小结 第18章 ...
目录 第一篇 .NET基础 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET ...17.4.5 ASP.NET MVC URL路由(URLRouting) 17.4.6 ASP.NET MVC控件辅助工具(Helper) 17.4.7 ASP.NET MVC表单传值 17.5 小结 第18章 ...
程序要调整的部分只有两块。一是web.config文件。二是链接地址。所需urlrewrite.dll ...下载安装后再bin目录下找到URLRewriter.dll文件 好了开始实施。第一步:将urlrewrite.dll下载到你的web程序目录里去。...
页面静态化有许多方式,最常见的就是类似很多PHP CMS种使用的 标签替换的方式(如:帝国CMS、EcShop等),还有很多都是伪静态,伪静态我们就不做过多解释,通过路由或Url重写来实现就可以了。Razor为我们提供了更加...
对于 ASP.NET 页面,IIS 会将此消息路由到 aspnet_isapi.dll ISAPI 扩展。然后,aspnet_isapi.dll ISAPI 扩展将处理操作传递给托管的 ASP.NET 辅助进程,该辅助程序将处理请求,并返回 ASP.NET 网页的呈现 HTML。 您...
静态页面生成(可以实现完全静态页面访问,也可以使用路由方式访问,没静态页面要求的,建议使用路由方式) 前台IP访问限制 站点信息设置 上传设置,水印设置 文章内容插入视频,大文件分片上传,播放器使用...
1.采用 asp.net mvc3.0 + SQL2008 开发。 2.使用存储过程,高效,访问速度快。 3.采用三层架构开发,所有返回类型统一ActionResults类型。 4.使用log4net日记记录,访问记录,便于维护。 5.支持静态国际化。 6.防...
静态页面生成(可以实现完全静态页面访问,也可以使用路由方式访问,没静态页面要求的,建议使用路由方式) 前台IP访问限制 站点信息设置 上传设置,水印设置 文章内容插入视频,大文件分片上传,播放器使用...