ASP NET Core SignalR OnDisconnectedAsync 未随集线器触发 [授权]

Юри*_*еев 2 signalr asp.net-core asp.net-core-signalr

.net核心2.1

中心代码:

[Authorize]    
public class OnlineHub : Hub
{
public override async System.Threading.Tasks.Task OnConnectedAsync()
{
    int userId = Context.UserIdentifier;
    await base.OnConnectedAsync();
}

[AllowAnonymous]
public override async System.Threading.Tasks.Task OnDisconnectedAsync(Exception exception)
{
    var b = Context.ConnectionId;

    await base.OnDisconnectedAsync(exception);

}
Run Code Online (Sandbox Code Playgroud)

客户端代码:

$(document).ready(() => {
        let token = "token";
        const connection = new signalR.HubConnectionBuilder()
            .withUrl("https://localhost:44343/online", { accessTokenFactory: () => token })
            .configureLogging(signalR.LogLevel.Debug)
            .build();

    connection.start().catch(err => console.error(err.toString()));
    });
Run Code Online (Sandbox Code Playgroud)

如果没有 [Authorize],一切都可以正常工作,除了 OnConnectedAsync 中的 Context.UserIdentifier,并且这是可以解释的,但是...使用 Hub 类上的 [Authorize] 属性,OnConnectedAsync 开始工作,而 OnDisconnected 根本不会触发,包括 30 秒超时(默认情况下)。

有任何想法吗?

小智 7

如果您连接了调试器并通过关闭浏览器选项卡来关闭客户端,那么您将永远不会观察到OnDisconnectedAsync被解雇。这是因为 SignalR 检查是否已连接调试器并且不会触发某些超时以使调试更容易。如果您通过在客户端上调用 stop 来关闭,那么您应该看到OnDisconnectedAsync被调用。