Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在多次调用信号器授权_C#_Asp.net_Signalr_Authorize Attribute - Fatal编程技术网

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%肯定这一点,这就是为什么我添加它作为一个评论。有多少用户正在连接到中心?你是否只有一个应用实例在运行(一个浏览器窗口)?没错!非常感谢。我将我的授权逻辑放在协商请求上,现在它工作得很好:)