C# 正在多次调用信号器授权
我正在努力跟踪连接到我的中心的用户。 我尝试这样做的方式是为我的集线器创建一个自定义授权属性,并检查试图连接的用户。如果用户已连接,则集线器不授权连接C# 正在多次调用信号器授权,c#,asp.net,signalr,authorize-attribute,C#,Asp.net,Signalr,Authorize Attribute,我正在努力跟踪连接到我的中心的用户。 我尝试这样做的方式是为我的集线器创建一个自定义授权属性,并检查试图连接的用户。如果用户已连接,则集线器不授权连接 public class SingleHubConnectionPerUserAttribute : Microsoft.AspNet.SignalR.AuthorizeAttribute { private static readonly HashSet<UserKey> connections = new
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;
}
}
公共类SingleHubConnectionPerUserAttribute:Microsoft.AspNet.signal.AuthorizeAttribute
{
私有静态只读HashSet连接=new HashSet();
公共覆盖bool AuthorizeHubConnection(HubDescriptor HubDescriptor,IRequest请求)
{
类型hubType=hubDescriptor.hubType;
字符串userId=request.User.Identity.GetUserId();
UserKey UserKey=新的UserKey(hubType,userId);
if(connections.Contains(userKey)| |!base.AuthorizeHubConnection(hubDescriptor,request))
{
返回false;
}
添加(userKey);
返回true;
}
}
如果每个连接只调用一次方法连接,这将很好,但实际情况并非如此
当我加载试图连接集线器的页面时,AuthorizeHubConnection奇怪地运行了多次,它运行的次数并不总是相同的,有时是5次,有时是3次,我真的不知道是什么原因导致了它
您知道什么会导致AuthorizeHubConnection被多次调用吗?每当SignalR server在执行任何其他操作之前收到HTTP请求时,都会调用Authorization(请参阅:)。当SignalR保持逻辑上持久的连接时,它会在幕后发出多个HTTP请求。当使用Websockets传输时,在启动连接(用于协商、连接和启动请求)时,通常只会看到其中的3个,每次重新连接都会看到一个。longPolling和serverSentEvents传输在每次发送数据(send)时创建一个HTTP请求。此外,longPolling创建轮询HTTP请求以接收数据(轮询)。这些请求中的每一个都必须经过授权,因此这就是您看到多个对AuthorizeHubConnection方法调用的原因 你把属性放在哪里?如果将属性放在中心本身上,则每次调用中心上的方法时都会调用该属性。我不是100%肯定这一点,这就是为什么我添加它作为一个评论。有多少用户正在连接到中心?你是否只有一个应用实例在运行(一个浏览器窗口)?没错!非常感谢。我将我的授权逻辑放在协商请求上,现在它工作得很好:)