最近有段時間沒更新部落格開發筆記了,怠惰了啊 = =..
趁著週末,給部落格專案完善了一些細節的功能,然後準備部署上線~
本來這篇文章是要記錄幾個功能(主題切換、專案監控、隨機圖片介面)的實現的,不過我在寫頁面的時候發現每次改完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,更新一下版本應該就行~
(過了十分鐘)更新好了,問題果然解決了!