一个文件搞定Asp.net core 3.1动态页面转静态页面
最近一个Asp.net core项目需要静态化页面,百度查找了一下,没有发现合适的。原因如下
- 配置麻烦。
- 类库引用了第三方类,修改起来麻烦。
- 有只支持MVC,不支持PageModel。
- 继承ActionFilterAttribute类,只重写了OnActionExecutionAsync,看似静态化了,其实运行时该查数据库还是查数据库,没有真正静态化。
- 缺少灵活性,没有在线更新静态文件方法,不能测试查看实时页面,没有进行Html压缩,没有使用gzip、br压缩文件.
于是我开始了页面静态化项目,只过几分钟就遇到了Asp.net core的一个大坑——Response.Body是一个只写Stream,无法读取返回的信息。
参考lwqlun的博客解决了,相关地址:https://www.cnblogs.com/lwqlun/p/10954936.html
代码如下:
var filePath = GetOutputFilePath(context);
var response = context.HttpContext.Response;
if (!response.Body.CanRead || !response.Body.CanSeek) {
using (var ms = new MemoryStream()) {
var old = response.Body;
response.Body = ms; await base.OnResultExecutionAsync(context, next); if (response.StatusCode == ) {
await SaveHtmlResult(response.Body, filePath);
}
ms.Position = ;
await ms.CopyToAsync(old);
response.Body = old;
}
} else {
await base.OnResultExecutionAsync(context, next);
var old = response.Body.Position;
if (response.StatusCode == ) {
await SaveHtmlResult(response.Body, filePath);
}
response.Body.Position = old;
}
解决了这个大坑后,就没遇过什么问题了。
项目地址:https://github.com/toolgood/StaticPage
快速入门
1、将HtmlStaticFileAttribute.cs放到项目下;
2、添加[HtmlStaticFile]
2.1、在控制器文件中,在类名或Action方法上添加[HtmlStaticFile]。
using Microsoft.AspNetCore.Mvc; namespace StaticPage.Mvc.Controllers
{
public class HomeController : Controller
{ [HtmlStaticFile]
[HttpGet("/Count")]
public IActionResult Count()
{
return View();
} }
}
2.2或 在PageModel文件中,在类名上添加[HtmlStaticFile]。
注:PageModel文件中,在方法上添加[HtmlStaticFile]是无效的。
using Microsoft.AspNetCore.Mvc; namespace StaticPage.Pages
{
[HtmlStaticFile]
public class CountModel : PageModel
{
public void OnGet()
{
}
}
}
其他配置
设置缓存文件夹
HtmlStaticFileAttribute.OutputFolder = @"D:\html";
使用压缩
HtmlStaticFileAttribute.UseBrCompress = true;
HtmlStaticFileAttribute.UseGzipCompress = true;
设置页面缓存时间
HtmlStaticFileAttribute.ExpireMinutes = 3;
使用开发模式 ,在开发模式,页面不会被缓存,便于开发调试。
HtmlStaticFileAttribute.IsDevelopmentMode = true;
支持Url参数,不推荐使用
HtmlStaticFileAttribute.UseQueryString = true;
使用Html压缩,推荐使用WebMarkupMin来压缩Html。
HtmlStaticFileAttribute.MiniFunc += (string html) => {
var js = new NUglifyJsMinifier();
var css = new NUglifyCssMinifier();
XhtmlMinifier htmlMinifier = new XhtmlMinifier(null, css, js, null);
var result = htmlMinifier.Minify(html);
if (result.Errors.Count == ) {
return result.MinifiedContent;
}
return html;
};
更新文件缓存
在Url地址后面添加参数“update”,访问一下就可以生成新的静态页面。
如:
https://localhost:44304/Count?__update__
测试页面,不更新文件缓存
在Url地址后面添加参数“test”,访问一下就可以生成新的静态页面。
如:
https://localhost:44304/Count?__test__
项目地址:https://github.com/toolgood/StaticPage
让分享变成常态,这个小项目我花费了3小时左右,如果你使用了这个项目也就等了节省了3小时的研究,
一个文件搞定Asp.net core 3.1动态页面转静态页面的更多相关文章
- php 一个文件搞定支付宝支付,微信支付
博客:https://me.csdn.net/jason19905 支付宝支付:https://github.com/dedemao/alipay 微信支付:https://github.com/de ...
- 一个PHP文件搞定微信H5支付
/ 更新于 2018-07-02 / 8 条评论 过年期间也坚持要撸码啊接着给博客除草,在这个小除夕是情人节的一天,祝大家新年快乐,情人节能够顺利脱单~~~ 回归正题,这篇文章介绍一下微信H5支付, ...
- 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定
1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...
- Jquery一个slideToggle搞定div的隐藏与显示
Jquery一个slideToggle搞定div的隐藏与显示 <!DOCTYPE html> <html> <head> <script src=" ...
- ASP.NET Core 2.2 基础知识(三) 静态文件
什么是静态文件? HTML,CSS,JS,图片等都叫做静态文件. 要想提供静态文件给客户端,需要注册静态文件中间件. 我们先分别添加一个 WebAPI 项目,一个 Razor 视图项目,比较两个项目的 ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- ASP.NET Core错误处理中间件[2]: 开发者异常页面
<呈现错误信息>通过几个简单的实例演示了如何呈现一个错误页面,该过程由3个对应的中间件来完成.下面先介绍用来呈现开发者异常页面的DeveloperExceptionPageMiddlewa ...
- asp.net之动态页面和静态页面的区别
asp.net之动态页面和静态页面的区别 当我开始接触web开发的时候,首先学到的是html.css.js这一类网页语言,通过布局可以搭建出一个静态网站,效果也跟我们上网时经常看到的一些网站一样了.于 ...
- Asp.Net中动态页面转静态页面
关于在Asp.Net中动态页面转静态页面的方法网上比较多.结合实际的需求,我在网上找了一些源代码,并作修改.现在把修改后的代码以及说明写一下. 一个是一个页面转换的类,该类通过静态函数Changfil ...
随机推荐
- Spring Boot JPA中关联表的使用
文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...
- 使nfs同步生效
我们在使用nfs的时候会遇到往nfs server端写个文件,client需要很久才能生效,我们想让立刻生效有两种办法:1.mount -t nfs -o noac IP:/data/xxxx /xx ...
- 状态压缩DP(大佬写的很好,转来看)
奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...
- C++类学习(2)
Ⅰ:类概念 一:类的构成 class 类名 { public: 公有数据成员和成员函数:类的接口 protected: 保护数据成员和成员函数: private: 私有数据成员和成员函数: }://注 ...
- 图论--传递闭包(Floyd模板)
#include<iostream> #include<cstring> #include<cmath> using namespace std; int dp[1 ...
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...
- unittest(discover 批量执行用例)
import unittest dir = "D:\\work_doc\\pycharm2\\python_Basics" #自动化用例所存放的路径 suit = unittest ...
- flink系列-10、flink保证数据的一致性
本文摘自书籍<Flink基础教程> 一.一致性的三种级别 当在分布式系统中引入状态时,自然也引入了一致性问题.一致性实际上是“正确性级别”的另一种说法,即在成功处理故障并恢复之后得到的结果 ...
- Adobe Reader XI 打开后“已停止工作”的解决办法
搜了好多方法按照步骤做完,基本无用,试了以下方法搞定. 具体方法是: 把域名解析到本机. 打开 C:\Windows\System32\drivers\etc\hosts 添加 127.0.0.1 a ...
- JDBC01 mysql和navicat的安装
navicat的安装 从网上下载的,详细过程,略 mysql8.0.11(win10,64)安装 1.下载 MySQL8.0 For Windows zip包下载地址:https://dev.mysq ...