日志

一个文件搞定Asp.net core 3.1动态页面转静态页面

 来源    2020-05-23    0  

最近一个Asp.net core项目需要静态化页面,百度查找了一下,没有发现合适的。原因如下

  1. 配置麻烦。
  2. 类库引用了第三方类,修改起来麻烦。
  3. 有只支持MVC,不支持PageModel。
  4. 继承ActionFilterAttribute类,只重写了OnActionExecutionAsync,看似静态化了,其实运行时该查数据库还是查数据库,没有真正静态化。
  5. 缺少灵活性,没有在线更新静态文件方法,不能测试查看实时页面,没有进行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 == 200) {
                        await SaveHtmlResult(response.Body, filePath);
                    }
                    ms.Position = 0;
                    await ms.CopyToAsync(old);
                    response.Body = old;
                }
            } else {
                await base.OnResultExecutionAsync(context, next);
                var old = response.Body.Position;
                if (response.StatusCode == 200) {
                    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 == 0) {
                    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小时的研究,

相关文章
一个PHP文件搞定微信H5支付
日志 / 更新于 2018-07-02 / 8 条评论 过年期间也坚持要撸码啊接着给博客除草,在这个小除夕是情人节的一天,祝大家新年快乐,情人节能够顺利脱单~~~ 回归正题,这篇文章介绍一下微信H5支付, ...
1
一个库搞定recyclerview – ARecyclerView
日志ARecyclerView 对RecyclerView的封装,功能强大.使用简单.扩展性强.该库主要分成三部分: RecyclerAdapter . XRecyclerView . XRecycler ...
1
asp.net-core – AppSettings.*.json文件未在ASP.NET CORE 1.1中的Publish上复制
问答我正在使用.csproj文件发布一个ASP.NET Core 1.1项目- 当我发布它时,项目被编译并且所有文件(包括wwwroot中的文件)都被复制,但是所有appsettings.*.json文件 ...
1
Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
日志有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了! 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是 ...
1
ASP.NET Core Razor生成Html静态文件
日志一.前言 最近做项目的时候,使用Util进行开发,使用Razor写前端页面.初次使用感觉还是不大习惯,之前都是前后端分离的方式开发的,但是使用Util封装后的Angular后,感觉开发效率还是杠杠滴. ...
1
ASP.NET Core 2.2 基础知识(三) 静态文件
日志原文:ASP.NET Core 2.2 基础知识(三) 静态文件什么是静态文件? HTML,CSS,JS,图片等都叫做静态文件. 要想提供静态文件给客户端,需要注册静态文件中间件. 我们先分别添加一个 ...
用一个应用场景理解ASP.NET Core Identity是什么?
日志@ 前言 有三个重要的类Claim, ClaimsIdentity, ClaimsPrincipal,我们以一个持有合法证件的学生Bob做比方: ClaimsPrincipal就是持有证件的学生Bob ...
几个步骤轻松搞定ASP.NET 依赖注入。
日志http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注入的问题.但是每次新建一个依 ...
Java 11 快要来了,编译 & 运行一个命令搞定!
日志Java 11 马上要来了,原定于 9 月发布,还有不到 3 个月了,敬请期待更多新功能被加入到 11 当中,本文本讲的是 JEP 330 这个新特性. 化繁为简,一个命令编译运行源代码 看下面的代码 ...
无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案
日志 ASP .NET Core MVC 发布到  IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件 ...
H5 拖拽,一个函数搞定,直接指定对象设置可拖拽
日志页面上,弹个小窗体,想让它可以拖拽,又不想 加载一堆js,就简单的能让他可以拖动? 嗯,下面有这样一个函数,调用下就好了! 1. 先来说说 H5的 拖拽 在 HTML5 中,拖放是标准的一部分,任何元 ...
1
将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定
日志1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...
一个类搞定UIScrollView那些事
日志前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...
1
基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何
日志基于 Vue.js 之 iView UI 框架非工程化实践记要 像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引用一 ...
1
Jquery一个slideToggle搞定div的隐藏与显示
日志Jquery一个slideToggle搞定div的隐藏与显示 <!DOCTYPE html> <html> <head> <script src=" ...
1
WEB安全第二篇--用文件搞定服务器:任意文件上传、文件包含与任意目录文件遍历
日志零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...
1
导航条滚动透明 一个分类搞定
日志下面这个界面有没有觉得很眼熟.打开你手里的App仔细观察,你会发现很多都有实现这个功能.比如美团外卖的首页模块,新浪微博的个人详情页面.要怎么样才能快速的实现这个功能呢!那下面由笔者来告诉你如何三行代 ...
1
一个类搞定SQL条件映射解析,实现轻量简单实用ORM功能
日志个人觉得轻简级的ORM既要支持强类型编码,又要有执行效率,还要通俗易懂给开发者友好提示,结合Expression可轻松定制自己所需要功能. Orm成品开源项目地址https://github.com/ ...
1
ASP.NET Core Web Api自动帮助页面
问答在以前的ASP.NET版本中,当我创建Web Api 2时,visual studio会自动为API自动生成文档. 它也在这里解释: http://www.asp.net/web-api/overvi ...
1
c# – ASP NET Core提供特定的html页面
问答我有这个中间件: public class SpecificPageMiddleware { private readonly RequestDelegate next; public Specifi ...
2