系列文章

  • 基于.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

基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译相关推荐

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

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

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

  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理

    基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理 转载于:https://github.com/Meowv/Blog 接下来,将完成一个任务调度 ...

  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据

    基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据 转载于:https://github.com/Meowv/Blog 在日志记录中使用的静态方法有人指出写法不 ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目

    基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目 转载于:https://github.com/Meowv/Blog 既然开发完成了,还是拿出来溜溜比较好,本篇是本 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)

    基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九) 转载于:https://github.com/Meowv/Blog 终于要接近尾声了,上一篇基本上将文 ...

  7. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)

    基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八) 转载于:https://github.com/Meowv/Blog 上一篇完成了标签模块和友情链接模块 ...

  8. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)

    基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七) 转载于:https://github.com/Meowv/Blog 上一篇完成了后台分类模块的所有功能 ...

  9. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)

    基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六) 转载于:https://github.com/Meowv/Blog 上一篇完成了博客文章详情页面的数据 ...

最新文章

  1. winpcap4.1.2手动清理关键
  2. arp欺骗攻击——获取内网中用户浏览的图片信息
  3. MySQL5日期类型DATETIME和TIMESTAMP相关问题详解
  4. 莫凡机器学习课程笔记
  5. 01: 实现注册登录功能
  6. Spring Stateless State Security第3部分:JWT +社会认证
  7. 数据结构算法 | 单调栈
  8. 阿里巴巴大数据实践—阿里巴巴的数据模型实践综述
  9. 异常处理汇总-数据库系列
  10. 深入学习Java虚拟机(三)
  11. NgDL:第三周:浅层NN
  12. 网站制作常用的cms系统有哪些?
  13. java超类_Java——超类和子类对象之间的转换
  14. matlab 类型强制转换,关于数据类型强制转换的分析和应用
  15. Windows Server 2019 配置DHCP
  16. Linux中将4块10T新硬盘合并成一个,挂载到Resource目录下
  17. mysql skip 1062_【20180205】MySQL 1032和1062跳过错误总结
  18. 树梅派烧录Lineage OS
  19. 招聘渠道超全汇总,最适合你的是哪一类?
  20. 大类资产配置策略(一)恒定混合策略(Constant-mix Strategy)

热门文章

  1. 老友记台词中英文对照Part1
  2. Android Native层
  3. 互联网公司如何管理研发团队
  4. 精益创业实战 - 第14章 评估产品和市场的匹配程度
  5. 【1】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 互联网企业数据
  6. 创意竖版产品发布会快闪PPT,等你来拿!
  7. Android第三方开发包之高德地图SDK使用介绍
  8. mybatis定义别名
  9. idea output 窗口悬浮
  10. 学习数据结构的意义和作用