<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 基于.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 宿主的運行環境需要重啟站點)才會生效。

    還可以配置條件編譯,詳情可以參考:http://www.tnepal.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,更新一下版本應該就行~

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

    參考資料

    posted @ 2022-06-19 22:22  程序設計實驗室  閱讀(384)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看