ASP.NET 页面双向静态化

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

用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 页面双向静态化的更多相关文章
- php 开启缓冲,页面纯静态化
服务器默认不开启php缓冲区 两种方法开启 1.php.ini out_put_buffer = on 2.ob_start(); 页面纯静态化 file_put_contents()写文件 ob_s ...
- PHP 404页面/如何设置404页面/URL静态化/URL伪静态化
php中如何设置404页面及其他错误页面 首先在项目根目录下新建文件,文件名为" .htaccess " 在该文件中写入一下配置项: ErrorDocument 404 /404. ...
- 使用Freemarker 实现JSP页面的静态化
使用Freemarker 静态化网页 一.原理 Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达 ...
- 一、springMVC、freemarker页面半自动静态化
说明:刚刚接到公司的通知,实现(半自动化),即通过参数控制是否需要静态化页面(哪里我说错了,勿喷!谢谢) 1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件 2,自由控制某 ...
- asp.net mvc3的静态化实现
静态化处理,可以大大提高客户的访问浏览速度,提高用户体验,同时也降低了服务器本身的压力.在asp.net mvc3中,可以相对容易地处理静态化问题,不用过多考虑静态网页的同步,生成等等问题.我提供这个 ...
- 如何做URL静态化 和页面的静态化
为什么要进行URL静态化? 如果帮到了您,您可以小支持一下,谢谢您 1.更好的迎合搜索引擎工作原理的爬行抓取机制:2.把网站URL静态化更有助于网站获得好的排名:3.URL静态化有利于用户体验.不 ...
- 利用ResultFilter实现asp.net mvc 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- 利用ResultFilter实现asp.net mvc3 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- MVC页面静态化
MVC 页面静态化 最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...
随机推荐
- 好用的开源库(二)——uCrop 图片裁剪
最近想要实现图片裁剪的功能,在Github上找到了这个uCrop,star的人挺多的,便是决定入坑,结果长达一个小时的看资料+摸索,终于是在项目中实现了图片裁剪的功能,今天便是来介绍一下uCrop的使 ...
- 吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络(二)
经典网络 LeNet-5 AlexNet VGG Ng介绍了上述三个在计算机视觉中的经典网络.网络深度逐渐增加,训练的参数数量也骤增.AlexNet大约6000万参数,VGG大约上亿参数. 从中我们可 ...
- 文件锁FileLock
1.文件锁的定义 FileLock是文件锁,进程锁,用于进程间并发,控制不同程序(JVM)对同一文件的并发访问. FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w) ...
- BZOJ 2683: 简单题 [CDQ分治]
同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...
- Linux设置DNS地址及清理DNS缓存方法
1.设置DNS地址 编辑vim /etc/resolv.conf 文件. 增加DNS地址:nameserver ip. 2.清理DNS缓存 清理dns缓存: 通过重启nscd服务来达到清理dns缓存的 ...
- 2019/1/10 redis学习笔记(二)
本文不涉及集群搭建操作 关于在lua脚本中操作redis的应用场景 大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们jav ...
- jQuery源码研究——解决命名冲突
在项目中难免不去使用多个插件,如此一来这些插件就有可能出现一样的名称,当出现同名变量时后一个将会覆盖上一个,这样的话我们就无法同时使用多个插件了. 当遇到这种情况我们可以手动去修改插件源码把它的名字改 ...
- 如何解决JavaScript中0.1+0.2不等于0.3
console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!= ...
- [NOIP]2016天天爱跑步
[NOIP]2016天天爱跑步 标签: LCA 树上差分 NOIP Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...
- CUP、内存、磁盘是如何在一起工作的
IT技术发展到今天,计算机能做的事情可谓复杂的多.那么计算机是如何做出如此复杂的运算的呢? 不准确的说,计算机主要做两件事,数据计算和数据存储. 第一先说说计算机是如何计算的吧. 我们平时见到的所有计 ...