dotnet watch修改代码后浏览器自动重载失效,VS Pro Ctrl+F5运行正常
问题根因
你遇到的问题是.NET 6预览版附带的MSBuild 17.x预览版与.NET 5 Blazor WebAssembly的dotnet watch工具存在兼容性冲突导致的。
dotnet watch的浏览器自动重载功能依赖构建过程中向页面注入的WebSocket客户端脚本,该脚本会监听服务端的重载通知触发页面刷新。你安装的MSBuild预览版修改了静态资源注入的逻辑,导致Kestrel启动时没有正确把自动重载的JS脚本注入到页面中,因此服务端重启后浏览器收不到刷新通知。
CSS热重载走的是独立的静态资源增量更新链路,不受该注入逻辑影响,所以可以正常工作。Visual Studio启动时使用IIS Express,走的是VS内部适配好的脚本注入逻辑,因此功能不受预览版MSBuild影响。
可排查的配置及修复方案
- 检查当前dotnet SDK的默认版本
运行命令dotnet --version确认当前默认调用的SDK版本,如果输出为.NET 6预览版,在项目根目录下添加global.json文件,指定项目使用.NET 5版本的SDK,示例配置如下:
{ "sdk": { "version": "5.0.408", "rollForward": "latestMinor" } }
配置保存后重新执行dotnet watch run验证自动重载功能。
- 检查项目文件的自动重载配置
打开项目的.csproj文件,确认不存在<DotNetWatchSupportsBrowserRefresh>false</DotNetWatchSupportsBrowserRefresh>配置项,如果存在将值改为true或者直接删除该行即可。 - 验证脚本注入是否正常
按下F12打开浏览器开发者工具,刷新页面后查看Console栏,是否存在dotnet-watch-browser-refresh.js相关的404报错或者WebSocket连接失败报错,如果存在该类报错即可确认是脚本注入失败导致的问题。 - 临时规避方案
如果不想修改全局SDK配置,可以在Visual Studio中用Ctrl+F5启动IIS Express进行开发,或者手动指定.NET 5 SDK的完整路径调用dotnet watch,示例命令:"C:\Program Files\dotnet\sdk\5.0.408\dotnet.exe" watch run
内容的提问来源于stack exchange,提问作者Patrick Szalapski
相关产品推荐
相关产品推荐

