blazor服务器端是否有任何热重装?

时间:2019-09-30 17:55:22

标签: c# blazor blazor-server-side

我只有一个简短的问题。 有什么方法可以热加载blazor应用程序?至少.razor文件? 现在,我将应用程序托管在本地IIS(不是IIS Express)上。

我正在浏览互联网,但没有发现任何帮助。

谢谢大家:)

7 个答案:

答案 0 :(得分:14)

更新2020-04-09:

我在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服务器。如果您仍然想查看消息_reconnectCallbackAttempting 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>

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

为解决此问题,我想使用browser-sync设置为Web应用程序的代理。

示例:

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

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

来自作者:

它使用剃刀引擎版本3将组件编译为c#类。 然后使用Roslyn编译器将这些类编译为汇编。 最后,我从一个程序集中加载了app.razor组件 反射并与Steve Sanderson Test主机一起修改库I 将组件转换为纯HTML。为了实时提供HTML文件,我使用了 WebSocket具有全双工通信。

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

https://github.com/martasp/BlazorLiveReload

有关该问题的一般主题:

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

答案 1 :(得分:6)

Thijs Tijsma的post对我有用。

您必须在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();
};

答案 2 :(得分:4)

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

dotnet watch run debug

答案 3 :(得分:3)

疼痛史

目前还没有真正好的解决方案可以自动重新编译更改的部分并尽可能节省时间,例如编辑并继续。另一个可悲的事实是 there is an open issue about it 自 2018 年 (!)。他们承诺最终会用 .NET 6 解决这个问题。我们会看看这是否值得更多,因为在社区的压力下,他们already promised a solution in the beginning of 2020 for .NET 5。大约 6 个月后,他们不得不告诉they couldn't make it to release after all for v5.

解决方法调试

什么不起作用

运行 dotnet watch run 是一件好事,但是当您想使用调试器时就会达到其局限性。即使使用 dotnet watch run debug,我也无法将 Visual Studio 附加到进程中,使其达到断点。我还尝试让 VS 使用 dotnet 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 一起使用。

Then I found a setting in VS which looks good,但没有效果,甚至在使用 IIS Express 时也没有效果:

enter image description here

我在调试中找到的唯一解决方法

_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 秒。

答案 4 :(得分:1)

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

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

LiveSharp是一种商业工具,可让您在运行时更新C#代码。

免责声明:我是作者

答案 5 :(得分:1)

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

答案 6 :(得分:0)

添加

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

到您的.csproj,然后运行:

dotnet watch run debug

这不是您可能期望的热重装,但它会自动执行重新运行过程。您只需要等待几秒钟,然后重新加载页面即可。