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 @@
-
+
+
+
+
+
+
+
+
+
+