48

我只有一个,快速的问题。有没有办法热重新加载 Blazor 应用程序?至少,.razor 文件?现在我在本地 IIS(不是 IIS express)上托管我的应用程序。

我正在浏览互联网,但我没有发现任何有用的东西。

谢谢大家的回答:)

4

8 回答 8

60

也许您可以尝试从命令提示符运行您的应用程序:

dotnet watch run debug
于 2019-09-30T18:00:35.693 回答
23

2021 年 11 月 10 日更新:

随着 Visual Studio 2022 的发布,2021-11-08 热重载现在可以开箱即用。升级您的项目以.NET 6获得最佳体验。

https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes#NET-HotReload-170

2021 年 4 月 9 日更新:

初始 .NET 热重载支持.NET 6 Preview 3

将“hotReloadProfile”:“aspnetcore”属性添加到您在launchSettings.json 中的启动配置文件中。对于 Blazor WebAssembly 项目,使用“blazorwasm”热重载配置文件。

使用dotnet watch.

您可以在文档中找到支持的代码编辑列表。

https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-3/#initial-net-hot-reload-support

感谢@Quango 指出这一点。

2020 年 4 月 9 日更新:

我没有使用,而是在下面browser-sync添加了以下代码_Host.cshtml<script src="_framework/blazor.server.js"></script>

<environment include="Development">
    <script>
        window.Blazor.defaultReconnectionHandler.onConnectionDown = function () {
            setTimeout(function () {
                location.reload();
            }, 7000);
        }
    </script>
</environment>

不是最佳的,但效果更好,因为您需要少一台 http 服务器。_reconnectCallback如果您仍然想查看消息Attempting to reconnect to the server...,也可以使用Could not reconnect to the server. Reload the page to restore functionality..

window.Blazor.defaultReconnectionHandler._reconnectCallback = function (d) {
    document.location.reload();
}

https://thijstijsma.nl/2020/02/18/blazor-server-hot-reload/ https://stackoverflow.com/a/59807998/3850405

原来的:

据从事 Blazor 项目的@danroth27 称,计划对 .NET 5 进行热重载,计划于 2020 年 11 月进行。

https://github.com/dotnet/aspnetcore/issues/5456#issuecomment-584219488

正如@MauricioAtanache 所说,您可以使用 dotnet watch 但不要忘记添加要观看的文件。例子:

dotnet watch --project BlazorTest.Server run

BlazorTest.Server.csproj 文件:

<ItemGroup>
    <Watch Include="..\**\*.razor" />
    <Watch Include="..\**\*.scss" />
    <Watch Include="..\**\*.cs" />
</ItemGroup>

然而,它不是真正的热重载,因为它会重新启动服务器,但您必须在浏览器中进行手动刷新。如果添加新文件,您还需要在重新加载之前编辑现有文件。

为了解决这个问题,我喜欢使用browser-sync设置作为您的网络应用程序的代理。

例子:

browser-sync start --proxy https://localhost:5001/ --files '**/*.razor,**/*.cshtml, **/*.css, **/*.js, **/*.htm*'

https://weblog.west-wind.com/posts/2019/May/18/Live-Reloading-Server-Side-ASPNET-Core-Apps

在 Github 上还有一个由 @martasp 调用的项目,该项目BlazorLiveReload应该在不刷新页面的情况下处理 Blazor Live Reload。

来自作者:

它使用 razor 引擎版本 3 将组件编译为 c# 类。然后使用 Roslyn 编译器,我将这些类编译为程序集。最后,我使用反射从程序集中加载了 app.razor 组件,并使用 Steve Sanderson 测试主机修改库将组件转换为纯 HTML。为了实时提供 HTML 文件,我使用 WebSockets 进行全双工通信。

我自己没有测试过这个项目,所以我不能说它的效果如何。

https://github.com/martasp/BlazorLiveReload

关于这个问题的一般线程:

https://github.com/dotnet/aspnetcore/issues/5456

于 2020-03-08T15:20:08.333 回答
7

Thijs Tijsma 有一篇文章对我有用。

您必须在没有附加调试器的情况下运行Visual Studio(Visual Studio中的CTRL+ )F5

Pages\_host.cshtml添加

<script src="_framework/blazor.server.js"></script>

<!-- Make sure you place it after the include for blazor.server.js -->

<environment include="Development">
    <script src="~/Scripts/HotReload.js"></script>
</environment>

然后只需制作重新加载js文件 wwwroot\scripts\HotReload.js

window.Blazor.defaultReconnectionHandler.onConnectionDown = function ()
{
    window.location.reload();
};
于 2020-04-29T14:06:03.000 回答
4

只需使用CTRL+启动项目F5(不附加调试器),进行更改并重新加载页面。

于 2020-04-25T07:15:18.153 回答
3

痛苦的历史

目前还没有真正好的解决方案可以自动重新编译更改的部分并尽可能节省时间,例如edit 和 continue。另一个可悲的事实是,自 2018 年以来就存在一个未解决的问题(!)。他们承诺最终会用 .NET 6 解决这个问题。我们会看看这是否值得更多,因为在社区的压力下,他们已经承诺在 2020 年初为 .NET 5 提供解决方案。大约 6 个月后,他们不得不说,他们毕竟无法发布 v5。

调试解决方法

什么不起作用

运行dotnet watch run是一件好事,但当你想使用调试器时,它就会受到限制。即使使用dotnet watch run debug,我也无法将 Visual Studio 附加到进程,以便它到达断点。我还尝试让 VSdotnet watch run debug使用以下配置文件条目运行launchSettings.json

"WatchDebug": {
  "commandName": "Executable",
  "executablePath": "dotnet.exe",
  "commandLineArgs": "watch run debug",
  "workingDirectory": "$(ProjectDir)",
  "launchBrowser": false,
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}

当文件更改时,该过程已启动并重新启动,但没有命中断点。也不与dotnet run -c debug

然后我在 VS 中找到了一个看起来不错的设置,但没有效果,即使在使用 IIS Express 时也没有效果:

在此处输入图像描述

我在调试中发现的唯一解决方法

注入你的配置_Host.cshtml

@inject IWebHostEnvironment env

并在之后添加以下调用blazor.server.js

@if (env.EnvironmentName != "Production") {
    <script>
        window.Blazor.defaultReconnectionHandler.onConnectionDown = function () {
            console.log('reloading')
            window.location.reload();
        };
    </script>
}

launchSettings.json 现在在不启动浏览器的情况下创建一个调试配置,因为这会让您单击要在每次更改时测试的页面,我们希望避免这种情况:

"MyProjectWithoutBrowser": {
  "commandName": "Project",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  },
  "dotnetRunMessages": "true",
  "applicationUrl": "http://localhost:5000"
}

确保 env 变量仅Debug在开发期间设置为,Production否则。在给定的 Url 上打开浏览器。如果您选择该配置并应用更改,请按[Ctrl] + [Shift] + [F5]。这将重新启动调试器,然后浏览器重新连接并且您会看到更改。在 hello world Blazor Server 应用程序上,这大约需要 3-4 秒。

于 2021-02-22T19:01:04.923 回答
2

LiveSharp ( https://www.livesharp.net )现在支持有状态的 Blazor 热重载

您可以在这里看到它的工作原理:https ://www.youtube.com/watch?v=MCh5-44UBpM

LiveSharp 是一个商业工具,允许您在运行时更新 C# 代码。

免责声明:我是作者

于 2020-03-26T13:10:23.160 回答
1

添加

<ItemGroup>
    <Watch Include="..\**\*.razor" />
    <Watch Include="..\**\*.scss" />
    <Watch Include="..\**\*.cs" />
</ItemGroup>

到你的 .csproj 然后运行:

dotnet watch run debug

这不是您可能期望的热重载,但它使重新运行过程自动化。您只需等待几秒钟并重新加载页面。

于 2020-04-14T15:21:48.627 回答
0

使用 dotnet 6.0
Tasks.json 中添加一个如下所示的新部分并将其称为例如watchRunBuild
(它是build的副本,但我已将watchRun添加到args的参数中,如下所示:

  {
        "label": "watchRunBuild",
        "command": "dotnet",
        "type": "process",
        "args": [
            "watch",
            "run",
            "build",
            "${workspaceFolder}/BlazorTest.csproj",
            "/property:GenerateFullPaths=true",
            "/consoleloggerparameters:NoSummary"
        ],
        "problemMatcher": "$msCompile"
    }

并在launch.json中将preLaunchTask
更改为watchRunBuild ,如下所示:

 "preLaunchTask": "watchRunBuild"
于 2021-12-07T08:49:29.227 回答