SignalR授权被多次调用

本文关键字:调用 授权 SignalR | 更新日期: 2023-09-27 18:06:12

我正试图跟踪连接到我的集线器的用户。我尝试的方法是为集线器创建一个自定义的Authorize属性,并检查正在尝试连接的用户。如果用户已经连接,则集线器不授权该连接

public class SingleHubConnectionPerUserAttribute : Microsoft.AspNet.SignalR.AuthorizeAttribute
    {
        private static readonly HashSet<UserKey> connections = new HashSet<UserKey>();
        public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
        {
            Type hubType = hubDescriptor.HubType;
            string userId = request.User.Identity.GetUserId();
            UserKey userKey = new UserKey(hubType, userId);
            if (connections.Contains(userKey) || !base.AuthorizeHubConnection(hubDescriptor, request))
            {
                return false;
            }
            connections.Add(userKey);
            return true;
        }
}

如果AuthorizeHubConnection方法在每个连接中只调用一次,这将工作得很好,但事实并非如此。

当我加载试图与hub连接的页面时,AuthorizeHubConnection奇怪地运行多次,并且它运行的次数并不总是相同的,有时是5次,有些是3次,我真的不知道什么可能导致它。

你知道什么会导致AuthorizeHubConnection不止一次被调用吗?

SignalR授权被多次调用

每次SignalR服务器在执行其他操作之前接收HTTP请求时都会调用授权(参见:https://github.com/SignalR/SignalR/blob/dev/src/Microsoft.AspNet.SignalR.Core/PersistentConnection.cs#L161)。当SignalR维护逻辑持久连接时,它在后台发出多个HTTP请求。当使用Websockets传输时,在启动连接时通常只会看到3个(用于协商、连接和启动请求),每次重新连接时只会看到一个。longPolling和serverSentEvents transport每次都创建一个HTTP请求来发送数据(send)。此外,longPolling创建一个轮询HTTP请求来接收数据(轮询)。这些请求中的每一个都必须经过授权,因此您会看到对AuthorizeHubConnection方法的多个调用。