`
wsql
  • 浏览: 11715113 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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项目

SNAGHTMLf9ef62

image

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中

SNAGHTML1048e8d

默认的ASP.NET Web Application已经为我们提供了不少页面,我就在下面的例子中将它们静态化吧。

二、页面静态化实现

1. 添加Routing引用

由于这里需要用到ASP.NET的路由映射(从.NET 3.5开始诞生),所以需要在项目中添加System.Web.Routing引用。

SNAGHTMLfc9503

SNAGHTML1007756

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下运行该网站,会出现下面的错误。

SNAGHTML2cedf45

这是因为IIS对该Web站点目录没有读写权限。

在IIS下:右键站点 > Edit Permissions > Security > Edit > Add > 输入IIS_IUSRS > Check Names > OK。

选择完毕后,为IIS_IUSRS用户添加Full Control权限。

image

image

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. 添加完该设置后,再运行一次网站,可能会出现下面的错误。

SNAGHTML2f65a2f

按照上面的步骤添加IUSR用户,为IUSR用户分配Read权限即可。

SNAGHTML2f8d75a

再次运行网站,能够正常访问页面了。

SNAGHTML2fd7e14

3. 配置web.config

网站虽然能运行,但是点击Home或About链接时会出现404错误。

SNAGHTML2ff02fc

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并不支持经典模式

SNAGHTML32bdeab

OK,似乎所有的该配置的地方都配置了,那么再去点击Index.html或About.html链接试试吧。

SNAGHTML32d4edb

如果现在去访问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代码ASP家教信息管理系统(源代码+论文)

    asp代码ASP家教信息管理系统(源代码+论文)本资源系百度网盘分享地址

    基于ssm高校毕业选题管理系统.zip

    基于ssm高校毕业选题管理系统.zip

    基于旷视研究院领先的深度学习算法,提供满足多业务场景的预训练模型.zip

    人工智能毕业设计&课程设计

    tensorflow_model_optimization-0.1.3.dev0-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    tensorflow_model_analysis-0.15.0-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    粒子群算法.docx 粒子群算法(Particle Swarm Optimization,PSO)是一种优化算法,受到鸟群或鱼

    粒子群算法 粒子群算法(Particle Swarm Optimization,PSO)是一种优化算法,受到鸟群或鱼群等群体行为的启发。该算法通过模拟群体中个体之间的合作和竞争来搜索最优解。粒子群算法通常用于解决连续优化问题。 ### 工作原理: 1. **初始化**:随机生成一群粒子(也称为个体),每个粒子代表搜索空间中的一个解,并随机初始化其位置和速度。 2. **评估**:根据每个粒子的位置,计算其对应的适应度值(目标函数值)。 3. **更新**:根据个体最优和全局最优的情况,更新每个粒子的速度和位置。粒子会根据自己历史最好的位置以及整个群体历史最好的位置进行调整,以期望更好的搜索方向。 4. **迭代**:重复评估和更新步骤,直到满足停止条件(如达到最大迭代次数、目标函数值足够接近最优解等)。 ### 主要参数: - 粒子数量(Population Size):群体中粒子的数量,通常越大越容易找到全局最优解,但计算成本也会增加。 - 惯性权重(Inertia Weight):控制粒子运动的惯性,平衡局部搜索和全局搜索能力。通常随着迭代次数增加而逐渐减小。

    20210327 AI-for-Drug-Discovery-2020.pdf

    20210327 AI-for-Drug-Discovery-2020

    tensorflow_model_optimization-0.1.2-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    Linux创建虚拟机的步骤

    Linux创建虚拟机的步骤

    基于SpringBoot的校园二手书交易管理系统设计源码

    这是一个基于SpringBoot开发的校园二手书交易管理系统,使用Java语言,包含102个文件。主要文件类型包括39个Java源文件、23个HTML文件、10个PNG图片文件、9个XML文件、9个JavaScript文件、4个CSS文件、2个Markdown文档、2个JPG图片文件、1个gitignore文件和1个SVG文件。该项目简洁易用,采用的技术经典,非常适合Java项目入门学习和企业级Java开发熟悉,提供了二手书交易管理、用户认证、数据统计等功能,旨在为校园内的二手书交易提供一个便捷、安全的平台。

    基于SSM的旅游管理系统.zip

    基于SSM的旅游管理系统.zip

    基于ssm框架网络财务设计与实现.zip

    基于ssm框架网络财务设计与实现.zip

    三菱PLC例程源码PLC同变频器通讯程序3

    三菱PLC例程源码PLC同变频器通讯程序3本资源系百度网盘分享地址

    基于ssm+jsp网上茶叶销售平台.zip

    基于ssm+jsp网上茶叶销售平台.zip

    通信专业毕业设计(论文)-企业网通信方案设计

    随着网络和科学技术的飞速发展,网络建设作为信息化建设的基础,也越来越受到企业的重视,网络结构和网络信息安全都是企业信息化建设中需要解决的重要问题。 本设计出于对众宇通讯公司长期稳定发展的考虑,针对公司的现状和发展需求,为公司设计了一个稳定的、相对安全的、可扩展并且可以支撑必要的网络应用的网络结构。在此次设计中,主要的运用到的技术与实现功能有:(1)汇聚交换机上使用DHCP技术,使各个接入层设备可自动获取相应的IP地址,也避免了IP地址的冲突;(2)运用VRRP技术,增强网络的连续性和稳定性,实现多链路备份冗余和网关备份冗余;(3)运用MSTP技术,将不同的VLAN与相应实例捆绑,避免了网络环路和广播风暴的产生;(4)通过防火墙技术,实现了企业内部与外部网络之间的信息交互安全。除此之外,还进行了VLAN的划分,端口安全设置,ACL访问限制,NAT地址转换,使用OSPF协议、静态路由等网络配置。 本论文基于华为ENSP仿真模拟软件,充分考虑到了整个公司网络今后的实用性、安全性以及可扩展性。利用所学的相关知识和网络技术,对众宇通讯公司的网络进行模拟设计。此设计根据三层网络结构来搭建网络拓扑,

    Gromacs中文手册5.0.2.pdf

    Gromacs中文手册5.0.2

    三菱PLC例程源码八层以下货梯通用程序(奥菱达)

    三菱PLC例程源码八层以下货梯通用程序(奥菱达)本资源系百度网盘分享地址

    seg.v

    seg.v

    ftqqzx.zip

    ftqqzx.zip

    基于tensorflow深度学习的中文机器阅读理解-完形填空.zip

    人工智能毕业设计&课程设计

Global site tag (gtag.js) - Google Analytics