如何取消Blazor Server烦人的重新连接?

如何,取消,blazor,server,烦人,重新,连接 · 浏览次数 : 1486

小编点评

**1. 创建Blazor Server的空项目** 创建一个新的Blazor Server项目,并确保在项目中设置以下选项: - 使用 SignalR 进行 WebSocket 连接 - 设置服务器超时时间 - 使用 Keep-Alive 机制检测连接状态 **2. 修改 boot.js 文件** 添加以下代码到 `boot.js` 文件中: ```javascript // 重试连接处理程序 let currentReconnectionProcess = null; // 重连接事件处理程序 Blazor.invokeMethod('OnReconnection'); // 重连接失败时触发事件 Blazor.on('ReconnectionFailed', () => { // 重置连接参数 currentReconnectionProcess = null; }); // 重连接成功时触发事件 Blazor.on('ReconnectionSuccessful', () => { // 清除重新连接 UI document.getElementById('blazor-error-ui').innerHTML = ''; }); ``` **3. 更新 Blazor.server.js 文件** 在 `Blazor.server.js` 文件中,修改 `OnReconnection` 方法,并在 `ReconnectionFailed` 和 `ReconnectionSuccessful` 事件中添加以下代码: ```javascript // 清除重新连接 UI document.getElementById('blazor-error-ui').innerHTML = ''; // 重新启动 Blazor 应用程序 Blazor.app.invokeMethod('Reload'); ``` **4. 设置服务器超时时间** 在 `Startup.cs` 文件中的 `Configure` 方法中设置服务器超时时间,例如: ```csharp // 设置服务器超时时间 app.UseSqlServer(_connectionString, "MyDatabase"); app.Server.SetTimeout(30000); ``` **5. 启动后端服务** 在 `Program.cs` 文件中启动后端服务,并确保它与前端进行绑定。 **6. 确保页面可见** 在页面加载完毕后,确保 `blazor-error-ui` 元素已隐藏。

正文

如何取消Blazor Server烦人的重新连接?

相信很多Blazor的用户在开发内部系统上基本上都选择速度更快,加载更快的Blazor Server模式。

但是Blazor Server由于是SignalR实现,所以在访问的时候会建立WebSocket通道,用于js交互和界面渲染,但是由于WebSocket是长连接,这样就会导致用户在界面的时候会一直建立链接,导致服务器宽度占用,所以微软默认会在无操作的情况下自动断开链接,然后会加上该死的重新链接的一个ui,很难看,导致很多用户看到灰色的效果。当然,微软也提供了如何处理这个情况的方案,下面我们会使用微软提供的方案解决这个问题。

创建Blazor Server的空项目

下面的刚刚创建的Blazor Server的空项目。

然后长时间挂着就会出现下面这个情况。

很丑的加载ui,灰色的全面覆盖样式,下面就得干掉这个。

去掉灰色加载样式。

新增boot.jsjs脚本,用于处理重新连接

boot.js 用于自定义重新连接的操作。并且接管重新连接的程序。

(() => {
    // 重试次数
    const maximumRetryCount = 10000;

    // 重试间隔
    const retryIntervalMilliseconds = 1000;

    const startReconnectionProcess = () => {

        let isCanceled = false;

        (async () => {
            for (let i = 0; i < maximumRetryCount; i++) {
                console.log(`试图重新连接: ${i + 1} of ${maximumRetryCount}`)
                await new Promise(resolve => setTimeout(resolve, retryIntervalMilliseconds));

                if (isCanceled) {
                    return;
                }

                try {
                    const result = await Blazor.reconnect();
                    if (!result) {
                        // 已到达服务器,但连接被拒绝;重新加载页面。
                        location.reload();
                        return;
                    }

                    // 成功重新连接到服务器。
                    return;
                } catch {
                    //没有到达服务器;再试一次。
                }
            }

            // 重试次数太多;重新加载页面。
            location.reload();
        })();

        return {
            cancel: () => {
                isCanceled = true;
            },
        };
    };

    let currentReconnectionProcess = null;

    Blazor.start({
            configureSignalR: function (builder) {
                let c = builder.build();
                c.serverTimeoutInMilliseconds = 30000;
                c.keepAliveIntervalInMilliseconds = 15000;
                builder.build = () => {
                    return c;
                };
            },
        reconnectionHandler: {
            onConnectionDown: () => currentReconnectionProcess ??= startReconnectionProcess(),
            onConnectionUp: () => {
                currentReconnectionProcess?.cancel();
                currentReconnectionProcess = null;
            },
        },
    });
})();
  • serverTimeoutInMilliseconds:服务器超时(以毫秒为单位)。 如果此超时已过但未从服务器接收任何消息,连接将终止并出现错误。 默认超时值为 30 秒。 服务器超时应至少是分配给 Keep-Alive 间隔 (keepAliveIntervalInMilliseconds) 的值的两倍。
  • keepAliveIntervalInMilliseconds:ping 服务器时采用的默认间隔。 使用此设置,服务器可以检测强行断开连接的情况,例如客户断开其计算机的网络连接。 此 ping 的发生频率最多与服务器 ping 的频率一样。 如果服务器每 5 秒 ping 一次,则分配的值低于 5000(5 秒)时,将会每 5 秒 ping 一次。 默认值为 15 秒。 Keep-Alive 间隔应小于或等于分配给服务器超时 (serverTimeoutInMilliseconds) 的值的一半。

修改Pages/_Host.cshtml

@page "/"
@using Microsoft.AspNetCore.Components.Web
@namespace BlazorApp1.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <base href="~/" />
    <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
    <link href="css/site.css" rel="stylesheet" />
    <link href="BlazorApp1.styles.css" rel="stylesheet" />
    <link rel="icon" type="image/png" href="favicon.png"/>
    <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
</head>
<body>
    <component type="typeof(App)" render-mode="ServerPrerendered" />

    <div id="blazor-error-ui">
        <environment include="Staging,Production">
            发生错误。此应用程序在重新加载之前可能不再响应。
        </environment>
        <environment include="Development">
            发生了一个未处理的异常。详细信息请参见浏览器开发工具。
        </environment>
        <a href="" class="reload">重新加载</a>
        <a class="dismiss">🗙</a>
    </div>

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script src="/boot.js"></script>
</body>
</html>

我们修改了blazor.server.js的引用。

<script src="_framework/blazor.server.js"></script>改成<script src="_framework/blazor.server.js" autostart="false"></script>

说一下为什么要改这个,实现我们需要自定义处理程序,但是引用了blazor.server.js,它就会直接执行,并不会等我们的处理程序,所以需要增加autostart="false"阻止默认的启动程序。

然后在下面的脚本中自定义自动程序,在上面还引用了 <script src="/boot.js"></script>

写完以后启动程序,然后将后端服务关闭,然后我们的界面并没有在出现上面的ui了。

当我们的后端启动就会和前端自动链接。并且不会对于前端有影响。

结尾

来自token的分享

Blazor技术交流群:452761192

与如何取消Blazor Server烦人的重新连接?相似的内容:

如何取消Blazor Server烦人的重新连接?

# 如何取消Blazor Server烦人的重新连接? 相信很多Blazor的用户在开发内部系统上基本上都选择速度更快,加载更快的`Blazor Server`模式。 但是`Blazor Server`由于是`SignalR`实现,所以在访问的时候会建立`WebSocket`通道,用于`js`交互和

【转帖】Linux中如何取消ln链接?(linuxln取消)

https://www.dbs724.com/163754.html Linux系统使用ln命令可以快速创建链接,ln链接是指把文件和目录链接起来,当改变源时可以快速地改变整个目录下的文件和目录。有时候,某些文件或者目录链接起来不是我们需要的,我们需要使用Linux取消ln链接命令。下面就来简单介绍

如何不显示我的电脑、回收站等图标?

本文介绍将Windows电脑中的Administrator、网络、回收站等系统自带桌面图标取消显示或恢复显示的方法~

如何在现有项目中使用`Masa MiniApi`?

首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFramework的MiniApi的包 创建Asp.NET Core 空的项目模板 项目名称MFMiniApi 其他信息看图,取消Https配置,也可以选择, 这就是

如何实现千万级优惠文章的优惠信息同步

金融社区优惠文章是基于京东商城优惠商品批量化自动生成的,每日通过不同的渠道获取到待生成的SKU列表,并根据条件生成优惠文章。 但是,生成优惠文章之后续衍生问题:该商品无优惠了,对应文章需要做取消推荐或下架处理,怎样能更快的知道该商品无优惠了呢?

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(8)-Charles如何进行断点调试

1.简介 Charles和Fiddler一样也有个强大的功能,可以修改发送到服务器的数据包,但是修改前需要拦截,即设置断点。设置断点后,开始拦截接下来所有网页,直到取消断点。这个功能可以在数据包发送之前,修改请求参数;在收到应答包,在js解析和浏览器渲染之前,修改返回结果。有了这个功能,开发者就可以

【Azure 环境】标准版 Logic App 如何查看 Workflow的执行成功数和失败数的指标呢?

问题描述 在Azure中创建逻辑应用(Logic App),有两种计划类型。一是消费型,另一种是标准型。 在消费型的Logic App Metrics页面中,我们可以看见Workflow的执行成功数指标和失败数指标。如: RunsCancelled 取消的运行数 Count 总计 已取消的工作流运行

RabbitMQ+redis+Redisson分布式锁+seata实现订单服务

引言 订单服务涉及许多方面,分布式事务,分布式锁,例如订单超时未支付要取消订单,订单如何防止重复提交,如何防止超卖、这里都会使用到。 开启分布式事务可以保证跨多个服务的数据操作的一致性和完整性, 使用分布式锁可以确保在同一时间只有一个操作能够成功执行,避免并发引起的问题。 订单流程(只展示重要的内容

谈谈Selenium中的三种切换之alert

谈谈Selenium中的三种切换之alert 一、如何识别 识别方法:alert中的确定、取消、输入框无法用inspector定位到,当然还有一些特例。 alert分为三种 alert confirm prompt 分别对应3个js的命令(可在chrome的console面板中调试) alert('

Squirrel状态机-从原理探究到最佳实践

作者:京东物流 郑朋辉 1 简介 Squirrel状态机是一种用来进行对象行为建模的工具,主要描述对象在它的生命周期内所经历的状态,以及如何响应来自外界的各种事件。比如订单的创建、已支付、发货、收获、取消等等状态、状态之间的控制、触发事件的监听,可以用该框架进行清晰的管理实现。使用状态机来管理对象生