SignalR 集线器在调用方法后关闭连接

时间:2021-07-21 06:55:49

标签: signalr asp.net-core-3.1 signalr-hub

我使用带有非常基本的集线器的网络核心 3.1 应用程序。一切都在本地按预期工作。但是在服务器上,执行第一次调用后,websocket 连接将关闭。

我确信在服务器上启用了 websockets。使用 Blazor Server 的另一部分工作正常。而且只要没有调用集线器方法,websocket 连接就处于活动状态。

客户端也接收集线器发送的数据。

在chrome中测试,点击按钮后,警告框显示三个消息。然后连接丢失:

<块引用>

未捕获(承诺)错误:由于底层连接关闭,调用被取消。

我已经测试过从本地机器用客户端连接到服务器,这不起作用。所以这里不应该是客户的问题。

使用本地客户端和本地运行的应用程序,一切正常。

TestHub.cs

using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;

namespace Test
{
    public class TestHub : Hub
    {
        public async Task Test(string name)
        {
            await Clients.Caller.SendAsync("Message", $"Hello, World! ({ name }) 1");
            await Clients.Caller.SendAsync("Message", $"Hello, World! ({ name }) 2");
            await Clients.Caller.SendAsync("Message", $"Hello, World! ({ name }) 3");
        }
    }
}

索引.html

<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>

<h1>Test</h1>
<button onclick="test()">Test</button>

<script>
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/Hub/Test")
        .configureLogging(signalR.LogLevel.Information)
        .build();

    function start() {
        try {
            connection.start();
            console.log("SignalR Connected.");
        } catch (err) {
            console.log(err);
            setTimeout(start, 5000);
        }
    };

    connection.on("Message", (message) => {
        alert(message);
    });

    function test() {
        try {
            connection.invoke("Test", "Foo");
        } catch (err) {
            alert(err);
        }
    }

    start();
</script>

1 个答案:

答案 0 :(得分:0)

引用 nuget Mongo2Go 导致了问题。在 3.1.3 版本中,他们添加了 System.Text.Json 5.0.1,这会破坏信号器。

将 Mongo2Go 降级到 3.1.1 版使信号器再次工作。