diff --git a/.github/workflows/auto-pull-request-checks.yml b/.github/workflows/auto-pull-request-checks.yml index 9884c1c6be1..a3f8a4f57f6 100644 --- a/.github/workflows/auto-pull-request-checks.yml +++ b/.github/workflows/auto-pull-request-checks.yml @@ -17,7 +17,7 @@ jobs: - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 10.0.x + global-json-file: global.json - name: Cache NuGet packages uses: actions/cache@v4 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d6060be9b53..05ef1b0e101 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: - name: Setup .NET Core SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 10.0.x + global-json-file: global.json - name: Cache NuGet packages uses: actions/cache@v4 diff --git a/.github/workflows/pack.yml b/.github/workflows/pack.yml index b20fdb6f686..5acf38d3fd0 100644 --- a/.github/workflows/pack.yml +++ b/.github/workflows/pack.yml @@ -20,7 +20,7 @@ jobs: - name: Setup .NET Core SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 10.0.x + global-json-file: global.json - name: Cache NuGet packages uses: actions/cache@v4 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c2789f8cc91..874a103eb6e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,7 +15,7 @@ jobs: - name: Setup .NET Core SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 10.0.x + global-json-file: global.json - name: Publish wasm run: | diff --git a/Version.props b/Version.props index a39d9af4200..ba81f4b13c8 100644 --- a/Version.props +++ b/Version.props @@ -1,8 +1,8 @@ - net10.0 - net6.0;net7.0;net8.0;net9.0;net10.0 + net11.0 + net6.0;net7.0;net8.0;net9.0;net10.0;net11.0 diff --git a/global.json b/global.json new file mode 100644 index 00000000000..1752ec8cef2 --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "11.0.100-preview.7.26381.103", + "rollForward": "latestPatch", + "allowPrerelease": true + } +} diff --git a/src/BootstrapBlazor.Server/Components/Samples/Reconnectors.razor b/src/BootstrapBlazor.Server/Components/Samples/Reconnectors.razor index e74fbfacfa7..102b9a21cee 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Reconnectors.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Reconnectors.razor @@ -16,9 +16,11 @@ </div> // add ReconnectorOutlet component -<component type="typeof(ReconnectorOutlet)" param-AutoReconnect="true" render-mode="ServerPrerendered" /> +<ReconnectorOutlet AutoReconnect="true" ReconnectInterval="5000" @@rendermode="new InteractiveServerRenderMode(false)" /> -

组件参数 AutoReconnect 用于控制是否开启网络重连,默认 true 已开启,可以通过 param-AutoReconnect="false" 关闭

+

AutoReconnect 用于控制是否在连接中断后自动检测服务是否恢复。默认 true;检测到服务恢复时,页面会自动重新加载。设置为 false 可关闭此行为。

+ +

ReconnectInterval 用于设置检测间隔,默认 5000 毫秒,最小值为 1000 毫秒。

@((MarkupString)Localizer["Step2"].Value)

@@ -269,3 +271,5 @@ </ReconnectRejectedTemplate> + + diff --git a/src/BootstrapBlazor.Server/Dockerfile b/src/BootstrapBlazor.Server/Dockerfile index 881334f77dc..645f4a4b5a3 100644 --- a/src/BootstrapBlazor.Server/Dockerfile +++ b/src/BootstrapBlazor.Server/Dockerfile @@ -1,7 +1,7 @@ #Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed. #For more information, please see https://aka.ms/containercompat -FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:11.0-preview AS base WORKDIR /app EXPOSE 8080 @@ -11,7 +11,7 @@ RUN apt install -y ./google-chrome-stable_current_amd64.deb RUN rm ./google-chrome-stable_current_amd64.deb RUN apt install -y fonts-wqy-microhei -FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:11.0-preview AS build WORKDIR / COPY . . diff --git a/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor b/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor index bbec66f16c0..c8591c0fec7 100644 --- a/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor +++ b/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor @@ -1,6 +1,6 @@ @namespace BootstrapBlazor.Components @inherits BootstrapModuleComponentBase -@attribute [BootstrapModuleAutoLoader("Reconnector/ReconnectorContent.razor.js", AutoInvokeDispose = false)] +@attribute [BootstrapModuleAutoLoader("Reconnector/ReconnectorContent.razor.js")]
diff --git a/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.cs b/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.cs index 9b966d50559..7779f1b530e 100644 --- a/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.cs +++ b/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.cs @@ -67,7 +67,7 @@ protected override async Task InvokeInitAsync() { if (AutoReconnect) { - await InvokeVoidAsync("reconnect", Math.Max(1000, ReconnectInterval)); + await InvokeVoidAsync("init", Id, Math.Max(1000, ReconnectInterval)); } } diff --git a/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.js b/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.js index 35607e281e6..e4378ff5cd1 100644 --- a/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.js +++ b/src/BootstrapBlazor/Components/Reconnector/ReconnectorContent.razor.js @@ -1,26 +1,93 @@ -export function reconnect(interval) { - const reconnectHandler = setInterval(async () => { - const com = document.getElementById('components-reconnect-modal') - if (com) { - if (com.classList.length === 0 || com.classList.contains('components-reconnect-hide')) { - return - } - else { - clearInterval(reconnectHandler) - - async function attemptReload() { - try { - await fetch('') - if (reloadHandler) { - clearInterval(reloadHandler) - } - location.reload() - } - catch { } - } - await attemptReload() - const reloadHandler = setInterval(attemptReload, interval) +import EventHandler from "../../modules/event-handler.js" +import Data from "../../modules/data.js" + +export function init(id, interval) { + dispose(id); + + const modal = document.getElementById('components-reconnect-modal'); + if (modal === null) { + return; + } + + let reloadHandler; + let reloadInProgress = false; + let disposed = false; + + const stopReloading = () => { + if (reloadHandler !== undefined) { + clearInterval(reloadHandler); + reloadHandler = undefined; + } + }; + + const attemptReload = async () => { + if (disposed || reloadInProgress) { + return; + } + + try { + const response = await fetch('', { cache: 'no-store' }); + if (!disposed && response.ok) { + reloadInProgress = true; + stopReloading(); + location.reload(); } } - }, interval) + catch { + } + }; + + const startReloading = () => { + if (reloadHandler !== undefined) { + return; + } + + reloadHandler = setInterval(attemptReload, interval); + void attemptReload(); + }; + + const updateReloading = () => { + if (modal.classList.length === 0 || modal.classList.contains('components-reconnect-hide')) { + stopReloading(); + } + else { + startReloading(); + } + }; + + const stateChanged = event => { + if (event.detail?.state === 'hide') { + stopReloading(); + } + else { + startReloading(); + } + }; + + const observer = new MutationObserver(updateReloading); + observer.observe(modal, { attributes: true, attributeFilter: ['class'] }); + EventHandler.on(modal, 'components-reconnect-state-changed.bb.reconnector', stateChanged); + + Data.set(id, { + modal, + observer, + stateChanged, + dispose: () => { + disposed = true; + stopReloading(); + } + }); + updateReloading(); +} + +export function dispose(id) { + const reconnector = Data.get(id); + if (reconnector === null) { + return; + } + + Data.remove(id); + reconnector.observer.disconnect(); + EventHandler.off(reconnector.modal, 'components-reconnect-state-changed.bb.reconnector', reconnector.stateChanged); + reconnector.dispose(); } diff --git a/src/BootstrapBlazor/Directory.Build.props b/src/BootstrapBlazor/Directory.Build.props index 789d2c09dad..ae91609a5a8 100644 --- a/src/BootstrapBlazor/Directory.Build.props +++ b/src/BootstrapBlazor/Directory.Build.props @@ -27,6 +27,7 @@ 8.0.* 9.0.* 10.0.0 + 11.0.0-rc.* @@ -75,7 +76,16 @@ - + + + + + + + + + +