热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Asp.NetMVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter

上一篇有提到利用IHttpModule和ResultFilter实现页面静态化功能。后来经过一些改动,将ResultFilter中要实现的功能全部转移到IHttpModule中来实现Asp.Net

上一篇有提到利用IHttpModule和ResultFilter实现页面静态化功能。后来经过一些改动,将ResultFilter中要实现的功能全部转移到IHttpModule中来实现

Asp.Net MVC页面静态化功能实现一:利用IHttpModule和ResultFilter

1、改动后的自定义IHttpModule实现代码:

public class RouterHttpModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest
+= this.Application_BeginRequest; //注册事件
}

private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application
= (HttpApplication)source;
HttpContext context
= application.Context;
string filePath = context.Request.FilePath;
string fileExtension = VirtualPathUtility.GetExtension(filePath);
//如果当前请求的不是资源文件、不是后台管理、请求中没有表单信息、静态页面存在,则返回静态页面
if (string.IsNullOrEmpty(fileExtension) && !filePath.ToLower().StartsWith("/admin") && context.Request.Form.Count.Equals(0))
{
string htmlPath = context.Request.HtmlFilePath();
if (File.Exists(htmlPath))
{
context.Response.WriteFile(htmlPath);
context.Response.End();
}
context.Response.Filter
= new HttpResponseFilterWrapper(context.Response.Filter, context);
}
}

public void Dispose() { }
}

这里只是在判断静态页面文件是否存在之后加了这样一段代码:context.Response.Filter = new HttpResponseFilterWrapper(context.Response.Filter, context);

 

2、HttpResponseFilterWrapper的实现代码

HttpResponseFilterWrapper的功能还跟以前一样,保存Filter中返回给客户端的html代码到服务器硬盘上

public class HttpResponseFilterWrapper : Stream
{
private Stream inner;
private HttpContext context;
public HttpResponseFilterWrapper(System.IO.Stream s, HttpContext context)
{
this.inner = s;
this.cOntext= context;
}

public override bool CanRead
{
get { return inner.CanRead; }
}

public override bool CanSeek
{
get { return inner.CanSeek; }
}

public override bool CanWrite
{
get { return inner.CanWrite; }
}

public override void Flush()
{
inner.Flush();
}

public override long Length
{
get { return inner.Length; }
}

public override long Position
{
get{ return inner.Position; }
set{ inner.Position = value; }
}

public override int Read(byte[] buffer, int offset, int count)
{
return inner.Read(buffer, offset, count);
}

public override long Seek(long offset, System.IO.SeekOrigin origin)
{
return inner.Seek(offset, origin);
}

public override void SetLength(long value)
{
inner.SetLength(value);
}

public override void Write(byte[] buffer, int offset, int count)
{
if (!context.Response.StatusCode.Equals(200))
{
return;
}
inner.Write(buffer, offset, count);
//if (!context.HttpContext.Request.FilePath.ToLower().StartsWith("/admin"))
//当前请求不是后台管理;并且返回客户端是html才生成静态页面
if (!context.Request.FilePath.ToLower().StartsWith("/admin") && context.Response.ContentType.Equals("text/html"))
{
//静态页面保存路径信息
string htmlPath = context.Request.HtmlFilePath();
string direcHtmlPath = Path.GetDirectoryName(htmlPath);
if (!Directory.Exists(direcHtmlPath))
{
Directory.CreateDirectory(direcHtmlPath);
}
//获取返回客户端的html代码,并进行压缩处理
string htmlCode = System.Text.Encoding.UTF8.GetString(buffer);
string isZipHtml = WebConfigInfo.GetConfigValueByKey("IsCompressed");
//如果“IsCompressed”的值为空或0,则表示不压缩
if (!string.IsNullOrEmpty(isZipHtml) && !isZipHtml.Equals(0))
{
htmlCode
= Regex.Replace(htmlCode, "^\\s*", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
htmlCode
= Regex.Replace(htmlCode, "\\r\\n", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
htmlCode
= Regex.Replace(htmlCode, "", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
}
//保存文件,这里不能用File.WriteAllText
File.AppendAllText(htmlPath, htmlCode);
}
}
}

 

3、确保静态页面数据的及时性

当在后台管理系统中,对某个栏目或某篇文章进行过增删改的操作时,要同时保证静态页面中的数据与数据库中的数据保持一致。

最初想到的实现方法是在静态页面中设定一个过期时间,但是公司所使用的框架中内容信息是通过异步加载进来的,所以保存的静态页面中不存标签,所以就放弃了这种方法。因为项目时间关系,最后偷了一点懒,在后台管理中添加一个“重新发布”的功能,直接将之前生成的静态页面全部删除掉。

 


推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 本文介绍了关于Java异常的八大常见问题,包括异常管理的最佳做法、在try块中定义的变量不能用于catch或finally的原因以及为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常。同时指出这些问题是由于不同的开发人员开发所导致的,不值得过多思考。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
author-avatar
爱你无丶止境空间
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有