当前位置: 首页 > news >正文

.NET MVC3关于生成纯静态后如何不再走路由直接访问静态页面

高访问量类型的电子商务网站,需要将一些不是经常变化的页面生成静态页面,然后普通用户就可以直接访问这些静态页面而不用再访问需要连接数据库的动态页面。那么ASP.NET MVC3中如何做到这一点呢?

要解决这个问题,我们需要先了解ASP.NET应用程序的生命周期,先看下面作者整理的一张图片:

从图中我们可以清楚的看到:通用IIS访问应用程序时,每次的单个页面URL访问时,都会先经过HttpApplication 管线处理请求,走过BeginRequest 事件之后才会去走路由访问具体的Controller和Action,最后结束的时候会请求EndRequest事件。下面用一张图来表示这个顺序:

注意图中标示的红色部分就是我们要实现的部分,实现如下:

1 新建MyHandler.cs

public class MyHandler:IHttpModule { public void Init(HttpApplication application) { application.BeginRequest += (new EventHandler(this.Application_BeginRequest)); application.EndRequest += (new EventHandler(this.Application_EndRequest)); } private void Application_BeginRequest(Object source, EventArgs e) { // Create HttpApplication and HttpContext objects to access // request and response properties. HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".html")) { context.Response.WriteFile(context.Server.MapPath(filePath));//直接走静态页面
//此处可以加入缓存,条件也可以根据需要来自己定义
context.Response.End(); } } private void Application_EndRequest(Object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".html")) { context.Response.Write("<hr><h1><font color=red>" + "HelloWorldModule: End of Request</font></h1>"); } } public void Dispose() { } }

2. web.config中加入以下代码,才会运行自定义的管道处理类

1: <httpModules>
2: <add name="MvcTest.MyHandler" type="MvcTest.MyHandler"/>
3: </httpModules>

运行一下自己的代码,看看效果你就全明白了!

补充:根据@小尾鱼的提示,如果直接在自己的项目文件下生产了和URL中一样的目录文件,比如访问:yourdomin.com/product/1.html,你的项目文件夹下真的存在product/1.html这个路径,那么IIS会直接去请求这个静态页面,如果项目中使用了自定义的管道处理程序,那么这个静态页仍然会走我们的自定义管道处理程序,我们可以在这里通过缓存来实现要不要重新成长静态页或删除过期产品的静态页,如果不使用此方法,只能去写执行计划,定时跑这些静态文件了,修改Application_BeginRequest

1: private void Application_BeginRequest(Object source,
2: EventArgs e)
3: {
4: // Create HttpApplication and HttpContext objects to access
5: // request and response properties.
6: HttpApplication application = (HttpApplication)source;
7: HttpContext context = application.Context;
8: string filePath = context.Request.FilePath;
9: string fileExtension =
10: VirtualPathUtility.GetExtension(filePath);
11: if (fileExtension.Equals(".html"))
12: {
13: //判断缓存是否存在,不存在加入缓存,调用生成静态的类和方法
14: //产品过期,移除静态文件,302重定向
15: if (System.IO.File.Exists(context.Server.MapPath(filePath)))
16: {
17: context.Response.WriteFile(context.Server.MapPath(filePath));
18: context.Response.End();
http://www.gsyq.cn/news/1630468.html

相关文章:

  • 基于STM32L432KC与Si4731的低功耗收音机开发实践
  • 如何快速掌握洛雪音乐音源配置:面向新手的终极实战指南
  • Selenium自动化测试的边界:10个不宜使用的场景与替代方案
  • 终极解密:JSXBin到JSX转换器如何彻底解决Adobe脚本黑盒难题
  • Windows 11终极优化指南:用Win11Debloat让系统更快更安全
  • 工业4-20mA电流环检测与STM32 ADC优化设计
  • .NET 高级开发 | http 接口对接和客户端开发技巧
  • 笔者为某云计算公司产品经理,负责产品的产品设计与前端开发管理。在工作引发了公司级别对产品和设计的讨论,有了以下文章。原文均作为邮件发在公司内部,以下截取出来希望收到更多的讨论。weibo:@侯振宇L4
  • 工业4-20mA电流环发射器设计与优化实践
  • 【JAVA毕设源码分享】基于springboot智能药箱系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 从AI代码风格到工程实践:Codex Taste如何重塑开发者的代码质量观
  • Mermaid Live Editor:免费在线图表编辑器的终极指南,3分钟快速上手
  • 灾害响应中的多语言情感分析实战:零标注、低延迟、高可解释
  • Xournal++完全指南:跨平台手写笔记与PDF批注的终极解决方案
  • [线性代数]正定矩阵
  • Real-ESRGAN-ncnn-vulkan 超分辨率工具:快速提升图像质量的实用指南
  • 海量用户积分排名算法探讨
  • 论文写不出学术味?师姐安利这几个AI写作辅助平台
  • VLC Media Player 2026最新下载安装使用全教程(全格式播放+网络流+投屏+踩坑总结)
  • 深度剖析猫抓Cat-Catch:从浏览器资源嗅探到专业媒体处理平台的技术演进与实践
  • 微信小程序技能交换平台开发实战与架构设计
  • Keploy实战:基于流量录制的零代码API自动化测试与集成测试
  • NLP工程实践指南:从XTREME到RABBIT的工业级落地方法论
  • 猫抓Cat-Catch:浏览器视频音频资源嗅探神器使用指南
  • GHelper终极指南:如何让华硕笔记本性能翻倍,告别臃肿的Armoury Crate
  • PCF8591与PIC18F87J50的I2C通信与混合信号处理实战
  • DS28EC20与PIC18F87J10组合在嵌入式系统中的应用
  • ASM330LHH与PIC18F97J60运动跟踪方案解析
  • Vanna AI:3步实现自然语言转SQL的终极实战指南
  • 终极M3U8视频下载技术:架构设计与高性能实现全解析