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 被多次调用吗?
每次 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 方法的多次调用的原因。
| 归档时间: |
|
| 查看次数: |
850 次 |
| 最近记录: |