一個文件搞定Asp.net core 3.1動態頁面轉靜態頁面


最近一個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

代碼如下:

 1             var filePath = GetOutputFilePath(context);
 2             var response = context.HttpContext.Response;
 3             if (!response.Body.CanRead || !response.Body.CanSeek) {
 4                 using (var ms = new MemoryStream()) {
 5                     var old = response.Body;
 6                     response.Body = ms;
 7 
 8                     await base.OnResultExecutionAsync(context, next);
 9 
10                     if (response.StatusCode == 200) {
11                         await SaveHtmlResult(response.Body, filePath);
12                     }
13                     ms.Position = 0;
14                     await ms.CopyToAsync(old);
15                     response.Body = old;
16                 }
17             } else {
18                 await base.OnResultExecutionAsync(context, next);
19                 var old = response.Body.Position;
20                 if (response.StatusCode == 200) {
21                     await SaveHtmlResult(response.Body, filePath);
22                 }
23                 response.Body.Position = old;
24             }

解決了這個大坑后,就沒遇過什么問題了。

項目地址:https://github.com/toolgood/StaticPage

快速入門

1、將HtmlStaticFileAttribute.cs放到項目下;

2、添加[HtmlStaticFile]

2.1、在控制器文件中,在類名Action方法上添加[HtmlStaticFile]

 1 using Microsoft.AspNetCore.Mvc;
 2 
 3 namespace StaticPage.Mvc.Controllers
 4 {
 5     public class HomeController : Controller
 6     {
 7     
 8         [HtmlStaticFile]
 9         [HttpGet("/Count")]
10         public IActionResult Count()
11         {
12             return View();
13         }
14 
15     }
16 }

2.2或 在PageModel文件中,在類名上添加[HtmlStaticFile]。

注:PageModel文件中,在方法上添加[HtmlStaticFile]是無效的。

 1 using Microsoft.AspNetCore.Mvc;
 2 
 3 namespace StaticPage.Pages
 4 {
 5     [HtmlStaticFile]
 6     public class CountModel : PageModel
 7     {
 8         public void OnGet()
 9         {
10         }
11     }
12 }

其他配置

設置緩存文件夾  

  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小時的研究,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM