SignalR Core-错误:Websocket已关闭,状态代码:1006

时间:2018-12-27 11:47:24

标签: mongodb signalr

我在Angular应用中使用SignalR。在销毁Angular中的组件时,我也想停止与集线器的连接。我使用命令:

this.hubConnection.stop();

但是我在Chrome控制台中收到一个错误: Websocket已关闭,状态代码为:1006

在Edge中: ERROR错误:未捕获(承诺):错误:由于关闭了连接,调用被取消。错误:由于连接已关闭,调用被取消。

它实际上有效,并且连接已停止,但是我想知道为什么会收到错误消息。

这是我启动集线器的方式:

this.hubConnection = new HubConnectionBuilder()
      .withUrl("/matchHub")
      .build();

    this.hubConnection.on("MatchUpdate", (match: Match) => {
      // some magic
    })

    this.hubConnection
      .start()
      .then(() => {
        this.hubConnection.invoke("SendUpdates");
      });

编辑

我终于找到了问题。它是由来自Mongo的更改流引起的。如果我从SendUpdates()方法中删除代码,则会触发OnDisconnected。

    public class MatchHub : Hub
    {
    private readonly IMatchManager matchManager;

    public MatchHub(IMatchManager matchManager)
    {
        this.matchManager = matchManager;
    }

    public async Task SendUpdates() {
        using (var changeStream = matchManager.GetChangeStream()) {
            while (changeStream.MoveNext()) {
                var changeStreamDocument = changeStream.Current.FullDocument;
                if (changeStreamDocument == null) {
                    changeStreamDocument = BsonSerializer.Deserialize<Match>(changeStream.Current.DocumentKey);
                }
                await Clients.Caller.SendAsync("MatchUpdate", changeStreamDocument);
            }
        }
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await base.OnDisconnectedAsync(exception);
    }
}

管理器中的方法GetChangeStream。

        ChangeStreamOptions options = new ChangeStreamOptions() { FullDocument = ChangeStreamFullDocumentOption.UpdateLookup };
        var watch =  mongoDb.Matches.Watch(options).ToEnumerable().GetEnumerator();
        return watch;

但是我不知道如何解决它。

2 个答案:

答案 0 :(得分:0)

这可能有很多原因,但我认为这很可能是这个原因:

  

我认为这是由于服务器如何处理连接/断开的事件。我不能肯定地说,但是连接关闭也需要使用代码在服务器上正确处理。尝试覆盖服务器上的内置On Connected / Disconnected方法,然后查看。我只是以为您要关闭它,但是服务器没有正确关闭,因此没有中继正确的关闭响应。

在评论中找到:getting the reason why websockets closed with close code 1006

在不需要更改连接/断开连接的地方,因为evrything可以正常工作。但作为答案,这是最有可能的。

答案 1 :(得分:0)

由于未正确清除回调,因此会引发错误。

这是由websocket返回的数据引起的。

通常它应该返回

enter image description here

但是,由于某种原因,它可能会返回类似

的内容

enter image description here

最后一个响应分为两部分

这会导致问题。

我认为不改变源代码就没有办法绕过它。

我也在here的GitHub存储库上报告了此问题

事实证明,我可以利用调用响应来通知客户端停止集线器。因此,它不会触发赛车问题。