SignalR 授权被多次调用

Vic*_*ado 2 c# asp.net authorize-attribute signalr

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

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;
        }
}
Run Code Online (Sandbox Code Playgroud)

如果每个连接只调用一次 AuthorizeHubConnection 方法,这将工作正常,但事实并非如此。

当我加载尝试与集线器连接的页面时,AuthorizeHubConnection 奇怪地运行了多次,并且它运行的次数并不总是相同,有时是 5,有些是 3,我真的不知道可能是什么造成它。

您知道什么会导致 AuthorizeHubConnection 被多次调用吗?

Paw*_*wel 5

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