天天看點

基于.NetCore開發部落格項目 StarBlog - (12) Razor頁面動态編譯

系列文章

  • 基于.NetCore開發部落格項目 StarBlog - (1) 為什麼需要自己寫一個部落格?
  • 基于.NetCore開發部落格項目 StarBlog - (2) 環境準備和建立項目
  • 基于.NetCore開發部落格項目 StarBlog - (3) 模型設計
  • 基于.NetCore開發部落格項目 StarBlog - (4) markdown部落格批量導入
  • 基于.NetCore開發部落格項目 StarBlog - (5) 開始搭建Web項目
  • 基于.NetCore開發部落格項目 StarBlog - (6) 頁面開發之部落格文章清單
  • 基于.NetCore開發部落格項目 StarBlog - (7) 頁面開發之文章詳情頁面
  • 基于.NetCore開發部落格項目 StarBlog - (8) 分類層級結構展示
  • 基于.NetCore開發部落格項目 StarBlog - (9) 圖檔批量導入
  • 基于.NetCore開發部落格項目 StarBlog - (10) 圖檔瀑布流
  • 基于.NetCore開發部落格項目 StarBlog - (11) 實作通路統計
  • 基于.NetCore開發部落格項目 StarBlog - (12) Razor頁面動态編譯
  • ...

前言

最近有段時間沒更新部落格開發筆記了,怠惰了啊 = =..

趁着周末,給部落格項目完善了一些細節的功能,然後準備部署上線~

本來這篇文章是要記錄幾個功能(主題切換、項目監控、随機圖檔接口)的實作的,不過我在寫頁面的時候發現每次改完Razor都要重新開機好麻煩,是以踩坑了一番,便有了本文。

Razor頁面動态編譯

雖然.Net6開始支援部分代碼熱更新了,不過還是很雞肋,經常修改Razor頁面了但點Apply還是沒效果~

我還是用回.NetCore3.1之前常用的動态編譯比較好~

首先NuGet安裝

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

,在

Program.cs

中配置一下

原本添加MVC服務是這樣的

builder.Services.AddControllersWithViews(
    options => { options.Filters.Add<ResponseWrapperFilter>(); }
)
           

改成這樣(開發模式才啟用動态編譯)

var mvcBuilder = builder.Services.AddControllersWithViews(
    options => { options.Filters.Add<ResponseWrapperFilter>(); }
);
if (builder.Environment.IsDevelopment()) {
    mvcBuilder.AddRazorRuntimeCompilation();
}
           

也可以不修改C#代碼,通過環境變量的方式實作,修改

launchSettings.json

檔案,添加一個環境變量

這樣啟動程式的時候會動态加載

RuntimeCompilation

"environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
    "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
}
           

另外,還有更徹底的方法,釋出打包的時候不要編譯cshtml檔案,友善在釋出後修改Razor頁面。

在項目配置檔案 (

xxx.csproj

) 中配置

<PropertyGroup>
    <RazorCompileOnBuild>false</RazorCompileOnBuild>
    <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>
           

這樣在釋出的時候,所有的 Razor 視圖都不會被預編譯了,并且所有的視圖都會一同被釋出,友善線上環境修改Razor頁面。

不過要注意在釋出的生産環境中,修改視圖檔案是不會立即生效的,需要重新開機程式(對于 IIS 宿主的運作環境需要重新開機站點)才會生效。

還可以配置條件編譯,詳情可以參考:https://www.cnblogs.com/thinksea/articles/14772837.html

這樣修改完Razor頁面,儲存,就會自動重新編譯,友善修改頁面後實時檢視效果。

配置動态編譯後報錯

我在這裡遇到一個問題,之前.NetCore3.1的項目沒遇到過

添加了動态編譯後啟動程式報錯

Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'source')
   at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
   at System.Linq.Enumerable.OfType[TResult](IEnumerable source)
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionDescriptorProvider..ctor(IEnumerable`1 pageRouteModelProviders, IOptions`1 mvcOptionsAccessor, IOptions`1 pag
esOptionsAccessor)
   ...省略一大堆報錯資訊
   at Program.<Main>$(String[] args) in StarBlog\StarBlog.Web\Program.cs:line 96
           

經過搜尋,找到一個Github issues:https://github.com/dotnet/aspnetcore/issues/40609

Do you have the 6.0.201 SDK / 6.0.3 Microsoft.AspNetCore.App runtime installed? Patch builds of packages typically require a corresponding version of the runtime to be installed.

看了下我的dotnet SDK版本,是 6.0.101 ,看來是SDK的bug,更新一下版本應該就行~

(過了十分鐘)更新好了,問題果然解決了!

參考資料

  • .Net Core 5.0 Razor 預編譯,動态編譯,混合編譯:https://www.cnblogs.com/thinksea/articles/14772837.html
  • .NET Hot Reload support for ASP.NET Core:https://docs.microsoft.com/en-us/aspnet/core/test/hot-reload?view=aspnetcore-6.0
  • Razor file compilation in ASP.NET Core:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-6.0&tabs=visual-studio
  • Can't get RazorPageOptions from DI with version 6.0.3 of Mvc.Razor.RuntimeCompilation:https://github.com/dotnet/aspnetcore/issues/40609

微信公衆号:「程式設計實驗室」

專注于網際網路熱門新技術探索與團隊靈活開發實踐,包括架構設計、機器學習與資料分析算法、移動端開發、Linux、Web前後端開發等,歡迎一起探讨技術,分享學習實踐經驗。

繼續閱讀