昨天写了一篇动态修改Cshtml的,不过那是在开发环境下,用IIS_Express或独立进程的方式。但最终发布到IIS,该如何更新呢?
这个不得不说是遇到一个巨大的坑了。
首先在网上查,似乎也很简单,就是在Startup.cs里的ConfigureServices()方法里加上
services.AddRazorPages().AddRazorRuntimeCompilation(); 包括最新的官网上都是这样写的,参见ASP.NET Core 中的 Razor 文件编译 | Microsoft Docs
另外,还要将FolderProfile.pubxml里的预编译设为False,
<RazorCompileOnBuild>false</RazorCompileOnBuild>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
我照做了,发布后却感觉有点不对劲:
1.如果不设为false,在发布目录下并没有生成XXXX.View.dll,只有一个XXXX.dll,我修改了一个Cshtml,发布到另一个目录,只将XXXX.dll更新到站点下,页面就更新了,说明Cshtml被编译到这个dll里了。
2.如果设为false,确实发布后有View目录了,但访问网站却直接报错了,说找不到内容。感觉根本没有执行AddRazorRuntimeCompilation()这个方法。
我仔细回忆了一下,这个startup.cs文件 在创建项目之初并不存在,是我手工添加的,难道是最新版本又有变化?再查了下项目的启动次序
https://www.cnblogs.com/whuanle/p/10095209.html
到progarm.cs里看了下,里面有个builder.Services.AddControllersWithViews(),我加上了启用动态编译的方法:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation();
var app = builder.Build();
再发布后,这次打开页面用了很长的时间,估计有戏了,应该是在动态编译。页面能打开了。试着改了下Cshtml,再刷新下页面,能看到更新了!
总结:应该是最新版本6.0做了启动方法的整合,弃用了Startup.cs,启动时的服务设置放到了Program.cs中,但是文档即没有更新....
建议:在学习Asp.net 6.0之前,建议先看下差异ASP.NET Core 6.0 的新增功能 | Microsoft Docs
因为其它地方的文档还没有更新,看这里就能理解为什么没有XXXXX.View.dll了