SignalR Core - Error: Websocket closed with status code: 1006

自闭症网瘾萝莉.ら 提交于 2020-07-06 07:11:20

问题


I use SignalR in an Angular app. When I destroy component in Angular I also want to stop connection to the hub. I use the command:

this.hubConnection.stop();

But I get an error in Chrome console: Websocket closed with status code: 1006

In Edge: ERROR Error: Uncaught (in promise): Error: Invocation canceled due to connection being closed. Error: Invocation canceled due to connection being closed.

It actually works and connection has been stopped, but I would like to know why I get the error.

This is how I start the hub:

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

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

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

EDIT

I finally find the issue. Its caused by change streams from Mongo. If I remove the code from SendUpdates() method then OnDisconnected is triggered.

    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);
    }
}

Method GetChangeStream from the manager.

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

But I don't know how to fix it.


回答1:


This can be for many reasons but i think it is most likely this one:

I think this is because of how the server is handling the connected / disconnected events. I can't say for sure but the connection closing needs to handled correctly on the server also with code. Try overriding the built in On Connected /Disconnected methods on the server and see. My assumption only is that you're closing it but the server isn't closing properly and therefore not relaying the proper closed response.

found as a comment at : getting the reason why websockets closed with close code 1006

Where you don't need to change the connection/disconection because evrything works fine. But as an answer this one is the most likely.




回答2:


It throws error because the callback doesn't get clear properly.

And it is caused by the return data from websocket.

normally it should return like

However, for some reason it might return something like

the very last response breaking into 2 pieces

And that causes the issue.

I don't think there is a way to bypass this without changing the source code.

I reported this on github repo as well at here

It turns out that I can just utilize invocation response to notify client to stop the hub. So it doesn't trigger racing issue.



来源:https://stackoverflow.com/questions/53944572/signalr-core-error-websocket-closed-with-status-code-1006

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!