而我们预期的结果应该如下图,实际只请求两次。

用301重定向可以解决该循环请求产生的问题。

OK, let’s begin.

本文的Demo和Source是基于上一篇的,如果下面的一些文件或文件夹没有提及创建的,表示已经在上一篇文章中创建过。

本文已经同步至我的个人博客站点:积累吧|ASP.NET 页面双向静态化

源代码下载:Routing-Static-Page-Demo-V2

Demo(点击这些链接会自动跳转到对应的.html页):

  • http://csdemo.jileiba.com
  • http://csdemo.jileiba.com/Default.aspx
  • http://csdemo.jileiba.com/Account/Login.aspx

1. 修改CustomRouteHandler类,添加RequestPath属性

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; }       
/// <summary>        /// 请求路径        /// </summary>       
public string RequestPath        {           
get { return VirtualPath.Substring(1); }        }               
public CustomRouteHandler(string
virtualPath)        {            this.VirtualPath = virtualPath;        }       
/// <summary>        /// 返回实际请求页       
/// </summary>        public
IHttpHandler GetHttpHandler(RequestContext
requestContext)        {            foreach
(var urlParm in requestContext.RouteData.Values)            {                requestContext.HttpContext.Items[urlParm.Key] = urlParm.Value;            }           
var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath,
typeof(Page))
as IHttpHandler;           
return page;        }    }}

RequestPath属性是从VirtualPath过来的,如果VirtualPath为~/default.aspx,那么对应的RequestPath则是/default.aspx

2. 在WebModule下创建CustomHttpModule.cs类

using System;using
System.Globalization;using System.Web;using
System.Web.Routing;using Routing_Static_Page_Demo.WebHandler;namespace
Routing_Static_Page_Demo.WebModule{    public class
CustomHttpModule :
IHttpModule    {        private HttpApplication
app;        public void Init(HttpApplication
context)        {            app = context;            app.AuthorizeRequest += App_AuthorizeRequest;        }       
public void App_AuthorizeRequest(object
sender, EventArgs e)        {           
HttpRequest req = app.Request;           
string path = req.Path;            // 如果是.aspx页面           
if (path.EndsWith(".aspx",
true, CultureInfo.CurrentCulture))            {               
// routeUrl则用于存放对应的.html                string
routeUrl = string.Empty;               
// 遍历RouteTable,找到.aspx页面对应的.html                foreach
(Route route in
RouteTable.Routes)                {                   
// 获取CustomRouteHandler                    var
handler = (CustomRouteHandler) route.RouteHandler;                   
// 获取CustomRouteHandler的RequestPath                   
string requestPath = handler.RequestPath;                   
if (requestPath.ToLower() == path.ToLower())                    {                        routeUrl = route.Url;                       
break;                    }                }               
// 将.aspx页面永久重定向到对应的.html页面                app.Response.StatusCode = 301;                app.Response.AddHeader("Location",
"/" + routeUrl);                app.Response.End();            }        }       
public void Dispose()        {        }    }}

如果你不太熟悉HttpApplication的事件,可以参照:MSDN HttpApplication事件


如果你不太熟悉HttpApplication的用法,可以参照:MSDN HttpApplication类

3. 修改web.config文件,添加HttpModule配置

黄色标记的地方是添加的,其它配置不变。

<?xml version="1.0"
encoding="UTF-8"?><configuration>  <system.web>   
<compilation debug="true"
targetFramework="4.0"
/>    <httpModules>      <add
name="CustomHttpModule"
type="Routing_Static_Page_Demo.WebModule.CustomHttpModule, Routing_Static_Page_Demo"
/>    </httpModules>  </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"
/>      <add name="CustomHttpModule"
type="Routing_Static_Page_Demo.WebModule.CustomHttpModule"
/>    </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>

在VS自带的WebDev服务器中运行这个项目:在浏览器栏输入http://localhost:xxxx/Default.aspx,会自动跳转到http://localhost:xxxx/Index.html,运行默认路径http://loclhost:xxxx/也会自动跳转到http://localhost:xxxx/Index.html。

4. 在IIS中运行项目

WebDev运行虽然通过了,IIS可不见得通过,毕竟WebDev的权限太高了。

果然,运行之后,出现下面的错误画面:

还是web.config的配置问题。在<webserver>节点下添加下面一行配置:

<validation validateIntegratedModeConfiguration="false"/>

这一行配置并不会真正影响web应用程序的安全性,它只是用于关闭有些配置将不会被使用的警告。

That’s end, have fun.nking, keep moving, even if the road obstacles , the one more important thing is that always be a pig for you, that's
keep fool.

ASP.NET 页面双向静态化的更多相关文章

  1. php 开启缓冲,页面纯静态化

    服务器默认不开启php缓冲区 两种方法开启 1.php.ini out_put_buffer = on 2.ob_start(); 页面纯静态化 file_put_contents()写文件 ob_s ...

  2. PHP 404页面/如何设置404页面/URL静态化/URL伪静态化

    php中如何设置404页面及其他错误页面 首先在项目根目录下新建文件,文件名为" .htaccess " 在该文件中写入一下配置项: ErrorDocument 404 /404. ...

  3. 使用Freemarker 实现JSP页面的静态化

    使用Freemarker 静态化网页 一.原理 Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达 ...

  4. 一、springMVC、freemarker页面半自动静态化

    说明:刚刚接到公司的通知,实现(半自动化),即通过参数控制是否需要静态化页面(哪里我说错了,勿喷!谢谢) 1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件 2,自由控制某 ...

  5. asp.net mvc3的静态化实现

    静态化处理,可以大大提高客户的访问浏览速度,提高用户体验,同时也降低了服务器本身的压力.在asp.net mvc3中,可以相对容易地处理静态化问题,不用过多考虑静态网页的同步,生成等等问题.我提供这个 ...

  6. 如何做URL静态化 和页面的静态化

    为什么要进行URL静态化? 如果帮到了您,您可以小支持一下,谢谢您   1.更好的迎合搜索引擎工作原理的爬行抓取机制:2.把网站URL静态化更有助于网站获得好的排名:3.URL静态化有利于用户体验.不 ...

  7. 利用ResultFilter实现asp.net mvc 页面静态化

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  8. 利用ResultFilter实现asp.net mvc3 页面静态化

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  9. MVC页面静态化

    MVC 页面静态化   最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...

随机推荐

  1. Yii框架里用grid.CGridView调用pager扩展不显示最后一页按钮的解决

    有如下一例,调用zii.widgets.grid.CGridView显示Blog信息,代码如下: $this->widget('zii.widgets.grid.CGridView', arra ...

  2. BZOJ 1923: [Sdoi2010]外星千足虫 [高斯消元XOR]

    1923: [Sdoi2010]外星千足虫 对于 100%的数据,满足 N≤1,000,M≤2,000. 裸高斯消元解异或方程组 给定方程顺序要求用从上到下最少的方程,那么找主元时记录一下最远找到哪个 ...

  3. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2194  Solved: 919[Submit][Status] ...

  4. HDU 4333 Revolving Digits [扩展KMP]【学习笔记】

    题意:给一个数字,每一次把它的最后一位拿到最前面,一直那样下去,分别求形成的数字小于,等于和大于原来数的个数. SAM乱搞失败 当然要先变SS了 然后考虑每个后缀前长为n个字符,把它跟S比较就行了 如 ...

  5. POJ 3689 Apocalypse Someday [数位DP]

    Apocalypse Someday Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 1807   Accepted: 87 ...

  6. Apache Hadoop配置Kerberos指南

    通常,一个Hadoop集群的安全使用kerberos来进行保障.在启用Kerberos后,需要用户进行身份验证.用户通过验证后可以使用GRANT/REVOKE语句来进行基于角色的访问控制.本文介绍一下 ...

  7. 用js脚本一键下载网页所有图片

    年前这两天稍微闲一点了,琢磨了一点js脚本,功能是把当前网页页面上的所有图片一次性保存到本地,免得每次都要对图片右键保存. 测试环境:Chrome开发者模式下(启动Chrome,按F12即可) 测试网 ...

  8. JDBC常见面试题

    以下我是归纳的JDBC知识点图: 图上的知识点都可以在我其他的文章内找到相应内容. JDBC常见面试题 JDBC操作数据库的步骤 ? JDBC操作数据库的步骤 ? 注册数据库驱动. 建立数据库连接. ...

  9. Windows Server 2016-重命名域控制器

    当公司发展到一定规模或者信息化建设到一定程度的情况下,很多信息化规范出台:很多初期服务器搭建包括服务搭建等计算机名等都是按照默认或者随机命名的,不便于区分业务或服务等.通过前边的章节我们对Active ...

  10. CentOS 7 安装Maven

    Maven的下载地址是:http://maven.apache.org/download.cgi 安装Maven非常简单,只需要将下载的压缩文件解压就可以了. cd /data wget http:/ ...