1個(gè)文件如何輕松搞定Asp.net core 3.1動(dòng)態(tài)頁面轉(zhuǎn)靜態(tài)頁面
前言
最近一個(gè)Asp.net core項(xiàng)目需要靜態(tài)化頁面,百度查找了一下,沒有發(fā)現(xiàn)合適的。原因如下
- 配置麻煩。
- 類庫引用了第三方類,修改起來麻煩。
- 有只支持MVC,不支持PageModel。
- 繼承ActionFilterAttribute類,只重寫了OnActionExecutionAsync,看似靜態(tài)化了,其實(shí)運(yùn)行時(shí)該查數(shù)據(jù)庫還是查數(shù)據(jù)庫,沒有真正靜態(tài)化。
- 缺少靈活性,沒有在線更新靜態(tài)文件方法,不能測試查看實(shí)時(shí)頁面,沒有進(jìn)行Html壓縮,沒有使用gzip、br壓縮文件.
于是我開始了頁面靜態(tài)化項(xiàng)目,只過幾分鐘就遇到了Asp.net core的一個(gè)大坑——Response.Body是一個(gè)只寫Stream,無法讀取返回的信息。
參考lwqlun的博客解決了,相關(guān)地址:http://www.dbjr.com.cn/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; }
解決了這個(gè)大坑后,就沒遇過什么問題了。
項(xiàng)目地址:https://github.com/toolgood/StaticPage
快速入門
1、將HtmlStaticFileAttribute.cs放到項(xiàng)目下;
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() { } } }
其他配置
設(shè)置緩存文件夾
HtmlStaticFileAttribute.OutputFolder = @"D:\html";
使用壓縮
HtmlStaticFileAttribute.UseBrCompress = true;
HtmlStaticFileAttribute.UseGzipCompress = true;
設(shè)置頁面緩存時(shí)間
HtmlStaticFileAttribute.ExpireMinutes = 3;
使用開發(fā)模式 ,在開發(fā)模式,頁面不會(huì)被緩存,便于開發(fā)調(diào)試。
HtmlStaticFileAttribute.IsDevelopmentMode = true;
支持Url參數(shù),不推薦使用
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地址后面添加參數(shù)“update”,訪問一下就可以生成新的靜態(tài)頁面。
如:
https://localhost:44304/Count?__update__
測試頁面,不更新文件緩存
在Url地址后面添加參數(shù)“test”,訪問一下就可以生成新的靜態(tài)頁面。
如:
https://localhost:44304/Count?__test__
項(xiàng)目地址:https://github.com/toolgood/StaticPage
總結(jié)
到此這篇關(guān)于1個(gè)文件如何輕松搞定Asp.net core 3.1動(dòng)態(tài)頁面轉(zhuǎn)靜態(tài)頁面的文章就介紹到這了,更多相關(guān)Asp.net core3.1動(dòng)態(tài)頁面轉(zhuǎn)靜態(tài)頁面內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net實(shí)現(xiàn)C#繪制太極圖的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)C#繪制太極圖的方法,實(shí)例分析了asp.net繪制圖形的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02使用 Salt + Hash 將密碼加密后再存儲(chǔ)進(jìn)數(shù)據(jù)庫
如果你需要保存密碼(比如網(wǎng)站用戶的密碼),你要考慮如何保護(hù)這些密碼數(shù)據(jù),象下面那樣直接將密碼寫入數(shù)據(jù)庫中是極不安全的,因?yàn)槿魏慰梢源蜷_數(shù)據(jù)庫的人,都將可以直接看到這些密碼2012-12-12在?Net7.0?環(huán)境下如何使用?RestSharp?發(fā)送?Http(FromBody和FromForm)請(qǐng)求
這篇文章主要介紹了在?Net7.0?環(huán)境下使用?RestSharp?發(fā)送?Http(FromBody和FromForm)請(qǐng)求,今天,我就兩個(gè)小的知識(shí)點(diǎn),就是通過使用?RestSharp?訪問?WebAPI,提交?FromBody?和?FromForm?兩種方式的數(shù)據(jù),還是有些區(qū)別的,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-09-09.net下調(diào)用sqlserver存儲(chǔ)過程的小例子
2013-06-06ASP.NET 頁面刷新和定時(shí)跳轉(zhuǎn)代碼整理
很多是摘網(wǎng)上的但是我整理了一下。以便以后查閱。2009-12-12asp.net 自定義控件實(shí)現(xiàn)無刷新上傳圖片,立即顯示縮略圖,保存圖片縮略圖
自定義控件實(shí)現(xiàn)無刷新上傳圖片,立即顯示縮略圖,保存圖片縮略圖2010-01-01