Есть ли горячая перезагрузка для серверной части Blazor?

У меня только один быстрый вопрос. Есть ли способ перезагрузить приложение Blazor? По крайней мере, файлы .razor? Теперь я размещаю свое приложение на локальном IIS (а не на IIS Express).

Я искал в Интернете, но не нашел ничего полезного.

Спасибо всем за ответ :)


person cebilon123    schedule 30.09.2019    source источник


Ответы (7)


Возможно, вы можете попробовать запустить свое приложение из командной строки:

dotnet watch run debug
person Mauricio Atanache    schedule 30.09.2019
comment
Большое спасибо! Работает так, как должно быть. Хорошего дня! - person cebilon123; 30.09.2019
comment
На самом деле мне пришлось использовать это в сочетании с: ‹script› Blazor.defaultReconnectionHandler._reconnectCallback = function (d) {document.location.reload (); } ‹/Script› - person D-Go; 02.06.2020
comment
Ура, это прекрасно работает. Он заставляет страницу автоматически перезагружаться при каждом изменении - не совсем гладко, но почти готово. - person Cornelius Roemer; 25.12.2020

Обновление 2021-04-09:

Первоначальная поддержка горячей перезагрузки .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-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-сервер меньше. Можно также использовать _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

Исходный:

По словам @ danroth27, работающего над проектом Blazor, для .NET 5 запланирована горячая перезагрузка, которая запланирована на ноябрь 2020 года.

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 без обновления страницы.

От автора:

Он использует движок бритвы версии 3 для компиляции компонентов в классы C #. Затем с помощью компилятора Roslyn я скомпилировал эти классы в сборку. Наконец, я загрузил компонент app.razor из сборки с отражением и с помощью модифицированной библиотеки Стива Сандерсона Test я превратил компонент в простой HTML. Чтобы обслуживать файлы HTML в реальном времени, я использовал WebSockets для полнодуплексной связи.

Я сам не тестировал этот проект, поэтому не могу сказать, насколько хорошо он работает.

https://github.com/martasp/BlazorLiveReload

Общая ветка по проблеме:

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

person Ogglas    schedule 08.03.2020
comment
Похоже, что функция горячей перезагрузки не будет поставляться с .NET 5: github.com / dotnet / aspnetcore / issues / 5456 # issuecomment-666728638 - person mvdgun; 05.08.2020
comment
Для меня горячая перезагрузка не работала с этими методами. Тем не менее, благодаря нескольким хитростям он работает. Из Powershell запускаем 2 окна: 1. dotnet watch run, 2. browser-sync start --proxy https://localhost:5001/ --files 'bin/Debug/netstandard2.1/BlazorApp.dll'. Без этого браузерная синхронизация срабатывает слишком рано и пропускает изменения. - person axon; 27.10.2020
comment
@axon Отлично - работает, спасибо! - person Faredoon; 04.12.2020
comment
Дальнейшее обновление: Предварительная версия .NET 6.0 3 теперь включает горячую перезагрузку. - person Quango; 09.04.2021
comment
Как отлаживать клиентскую часть с помощью горячих перезагрузок? - person Alex Kovanev; 17.04.2021

У Thijs Tijsma была запись, которая у меня сработала.

Вы должны работать без отладчика, прикрепленного в Visual Studio (CTRL + F5 в Visual Studio)

в 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();
};
person Niederee    schedule 29.04.2020

Просто запустите проект с помощью CTRL + F5 (без подключения отладчика), внесите изменения и перезагрузите страницу.

person Ali Besharati    schedule 25.04.2020

История боли

В настоящее время не существует действительно хорошего решения, которое автоматически повторно компилирует измененные части и экономит как можно больше времени, например редактировать и продолжать. Еще один печальный факт заключается в том, что по этому поводу существует нерешенная проблема с 2018 года (!). Они обещают наконец исправить это с помощью .NET 6. Посмотрим, стоит ли это большего, потому что после давления сообщества они уже обещал в начале 2020 года решение для .NET 5. Примерно через 6 месяцев им пришлось сказать, что не удалось выпустить его все-таки для 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.

Затем я нашел настройку в 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 секунд.

person Lion    schedule 22.02.2021

Теперь в LiveSharp есть поддержка горячей перезагрузки Blazor с отслеживанием состояния (https://www.livesharp.net)

Вы можете увидеть, как это работает здесь: https://www.youtube.com/watch?v=MCh5-44UBpM

LiveSharp - это коммерческий инструмент, который позволяет обновлять код C # во время выполнения.

Отказ от ответственности: я автор

person ionoy    schedule 26.03.2020
comment
Следует отметить, что это ежемесячная плата от 9,90 до 19 евро в зависимости от личного / делового использования. - person Ogglas; 09.04.2020

Добавлять

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

в ваш .csproj, а затем запустите:

dotnet watch run debug

Это не горячая перезагрузка, как можно было бы ожидать, но она автоматизирует процесс повторного запуска. Вам просто нужно подождать несколько секунд и перезагрузить страницу.

person CageE    schedule 14.04.2020