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服务器在执行其他操作之前接收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方法的多个调用。