系列文章

前言

最近有段时间没更新博客开发笔记了,怠惰了啊 = =..

趁着周末,给博客项目完善了一些细节的功能,然后准备部署上线~

本来这篇文章是要记录几个功能(主题切换、项目监控、随机图片接口)的实现的,不过我在写页面的时候发现每次改完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,更新一下版本应该就行~

(过了十分钟)更新好了,问题果然解决了!

参考资料

基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译的更多相关文章

  1. 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  2. 基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. 基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  4. 基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  5. 基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  6. 基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传

    前言 九月太忙,只更新了三篇文章,本来这个功能是从九月初就开始做的,结果一直拖到现在国庆假期才有时间完善并且写文章~ 之前我更新了几篇关于 Python 的文章,有朋友留言问是不是不更新 .Net 了 ...

  7. 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索

    前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...

  8. 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 ... 基于. ...

  9. 基于.NetCore开发博客项目 StarBlog - (3) 模型设计

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

随机推荐

  1. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  2. Revit二次开发之添加选项卡和按钮

      我们日常在revit开发中经常会用到按钮,可以通过revitAPI提供的接口创建按钮,今天我简单介绍一下两种按钮,一种是单命令按钮,另一种是含下拉菜单的按钮,包括创建他们的方法. 实现方法 1.实 ...

  3. UML的三项基础

    UML的定义 UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号和文本语法提供标准. 五类模型图 用例视图:用例图 逻辑视图:类图.对象图.包图(我把包放在一起的图) 静态视图 ...

  4. uniapp 入门

    uniapp官网 uni-app 是一个使用 Vue.js (opens new window)开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小 ...

  5. 【kubernetes 问题排查】使用 kubeadm 部署时遇到的问题

    引言 再使用kubeadm部署集群时会多少遇到一些问题,这里做下记录,方便后面查找问题时有方向,同时也为刚要入坑的你指明下方向,让你少走点弯路 问题汇总 The connection to the s ...

  6. ViewFlipper 简单应用

    AdvserView.java package com.earen.viewflipper; import android.content.Context; import android.graphi ...

  7. mask-image实现聚光灯效果

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  8. /proc/meminfo 解释

  9. 5.文件共享总结中篇-Linux服务器文件共享

    今天我们来讨论Linux系统之间的文件共享,包含:SCP.FTP.rz / sz.wget 一.SCP 其实我在写SSH协议常见问题排错章节中已介绍其SCP用法. 现我把SCP常用语法格式,给大家说下 ...

  10. 优化 Docker 镜像大小常见方法

    平时我们构建的 Docker 镜像通常比较大,占用大量的磁盘空间,随着容器的大规模部署,同样也会浪费宝贵的带宽资源.本文将介绍几种常用的方法来优化 Docker 镜像大小,这里我们使用 Docker ...