1個文件如何輕松搞定Asp.net core 3.1動態頁面轉靜態頁面

 更新時間:2020-06-14 00:02:04   作者:佚名   我要評論(0)

前言
最近一個Asp.net core項目需要靜態化頁面,百度查找了一下,沒有發現合適的。原因如下

配置麻煩。
類庫引用了第三方類,修改起來麻煩。
有只支持MVC,不

前言

最近一個Asp.net core項目需要靜態化頁面,百度查找了一下,沒有發現合適的。原因如下

  1. 配置麻煩。
  2. 類庫引用了第三方類,修改起來麻煩。
  3. 有只支持MVC,不支持PageModel。
  4. 繼承ActionFilterAttribute類,只重寫了OnActionExecutionAsync,看似靜態化了,其實運行時該查數據庫還是查數據庫,沒有真正靜態化。
  5. 缺少靈活性,沒有在線更新靜態文件方法,不能測試查看實時頁面,沒有進行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應用錯誤處理之三種呈現錯誤頁面的方式

相關文章

  • 1個文件如何輕松搞定Asp.net core 3.1動態頁面轉靜態頁面

    1個文件如何輕松搞定Asp.net core 3.1動態頁面轉靜態頁面

    前言 最近一個Asp.net core項目需要靜態化頁面,百度查找了一下,沒有發現合適的。原因如下 配置麻煩。 類庫引用了第三方類,修改起來麻煩。 有只支持MVC,不
    2020-06-14
  • ASP.NET Core3.x API版本控制的實現

    ASP.NET Core3.x API版本控制的實現

    前言 一般來說需要更改我們API的時候才考慮版本控制,但是我覺得我們不應該等到那時候來實現它,我們應該有一個版本策略從我們應用程序開發時就開始制定好我們的
    2020-06-14
  • Asp.net Core中實現自定義身份認證的示例代碼

    Asp.net Core中實現自定義身份認證的示例代碼

    Asp.Net Core中雖然集成了許多常用的身份認證,但很多時候,我們還是需要實現自己的身份認證接口,本文這里就簡單的介紹下如何實現自定義身份認證接口。 首先寫一個
    2020-06-14
  • ASP.NET Core WebAPI實現本地化(單資源文件)

    ASP.NET Core WebAPI實現本地化(單資源文件)

    在Startup ConfigureServices 注冊本地化所需要的服務AddLocalization和 Configure<RequestLocalizationOptions> public void ConfigureServices(IServiceCollec
    2020-06-14
  • 關于.NET Attribute在數據校驗中的應用教程

    關于.NET Attribute在數據校驗中的應用教程

    前言 Attribute(特性)的概念不在此贅述了,相信有點.NET基礎的開發人員都明白,用過Attribute的人也不在少數,畢竟很多框架都提供自定義的屬性,類似于Newtonsoft
    2020-06-14
  • ASP.NET開源導入導出庫Magicodes.IE完成Csv導入導出的方法

    ASP.NET開源導入導出庫Magicodes.IE完成Csv導入導出的方法

    說明 本章主要說明如何使用Magicodes.IE.Csv進行Csv導入導出. 關于Magicodes.IE 導入導出通用庫,通過導入導出DTO模型來控制導入和導出,支持Excel、Word、Pd
    2020-06-14
  • .net core 3.1在iis上發布的踩坑記錄

    .net core 3.1在iis上發布的踩坑記錄

    前言 寫這篇文章的目的是希望像我一樣喜歡.net 的人在發布 core到 iis上時少走點彎路 網上找了些資料,其實實際操作比較簡單,就是有幾個坑很惡心 踩坑記錄 首先是你
    2020-06-14
  • .NET IoC模式依賴反轉(DIP)、控制反轉(Ioc)、依賴注入(DI)

    .NET IoC模式依賴反轉(DIP)、控制反轉(Ioc)、依賴注入(DI)

    依賴倒置原則(DIP) 依賴倒置(Dependency Inversion Principle,縮寫DIP)是面向對象六大基本原則之一。他是指一種特定的的解耦形式,使得高層次的模塊不依賴低層次的
    2020-06-14
  • asp.net mvc core管道及攔截器的理解

    asp.net mvc core管道及攔截器的理解

    今天來看一下asp.net core的執行管道。先看下官方說明: 從上圖可以拋光,asp.net core的執行順序是,當收到一個請求后,request請求會先經過已注冊的中間件,然后
    2020-06-14
  • 聊一聊Asp.net過濾器Filter那一些事

    聊一聊Asp.net過濾器Filter那一些事

    最近在整理優化.net代碼時,發現幾個很不友好的處理現象:登錄判斷、權限認證、日志記錄、異常處理等通用操作,在項目中的action中到處都是。在代碼優化上,這一點是
    2020-06-14

最新評論

买宝宝用品赚钱吗 河北排列7玩法 青海11选5开奖结果爱彩乐 湖北快三开奖结果今天 山西十一选五电视走势图 11选5万能九码守号 卓信宝配资 博彩公司 淘宝购买彩票安全吗 广西快乐双彩最新公告 宁夏十一选五下注 广西双彩24选6走势图 119博彩 融盛在线配资骗局 排列三直选综合走势图 分分彩自动投注软件手机版 北京快乐8几号开市