文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

1个文件如何轻松搞定Asp.net core 3.1动态页面转静态页面

2022-06-07 21:47

关注

前言

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

配置麻烦。 类库引用了第三方类,修改起来麻烦。 有只支持MVC,不支持PageModel。 继承ActionFilterAttribute类,只重写了OnActionExecutionAsync,看似静态化了,其实运行时该查数据库还是查数据库,没有真正静态化。 缺少灵活性,没有在线更新静态文件方法,不能测试查看实时页面,没有进行Html压缩,没有使用gzip、br压缩文件.

于是我开始了页面静态化项目,只过几分钟就遇到了Asp.net core的一个大坑——Response.Body是一个只写Stream,无法读取返回的信息。

参考lwqlun的博客解决了,相关地址:https://www.jb51.net/article/187210.htm

代码如下:


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

总结

到此这篇关于1个文件如何轻松搞定Asp.net core 3.1动态页面转静态页面的文章就介绍到这了,更多相关Asp.net core3.1动态页面转静态页面内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文章:在ASP.NET Core中显示自定义的错误页面浅谈ASP.NET Core 2.0 布局页面(译)ASP.NET Core应用错误处理之三种呈现错误页面的方式


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯