如何持久化SignalR连接ID [英] How to persist SignalR connection ID

查看:32
本文介绍了如何持久化SignalR连接ID的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建一个聊天应用程序,其中用户id由他们自动生成的SignalR连接id表示。在页面刷新时,连接ID会在实例化新连接时更改。有没有办法保持用户的连接ID的状态,直到浏览器会话结束(即,直到他在客户端结束会话)。

是否有任何指南或文档?这真的会有帮助的。

我是SignalR的新员工。所以在谷歌上搜索一下,想知道很多东西。从这个url中,我得到了一个类似的代码片段http://kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

他们说这是可能的。问题是,如果我们引用页面,SignalR通常会创建一个新的连接ID。我想阻止这件事,但是如何.

此代码段。

public class MyConnectionFactory : IConnectionIdFactory
    {
        public string CreateConnectionId(IRequest request)
        {
            if (request.Cookies["srconnectionid"] != null)
            {
                return request.Cookies["srconnectionid"];
            }

            return Guid.NewGuid().ToString();
        }
    }

$.connection.hub.start().done(function () {
        alert("Connected!");
        var myClientId = $.connection.hub.id;
        setCookie("srconnectionid", myClientId);
    });

    function setCookie(cName, value, exdays) {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + exdays);
        var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
        document.cookie = cName + "=" + c_value;
    }

我怀疑它在所有SignalR版本中都能工作吗?如果不是,那么如何在新版本中特别处理它,以便在页面被刷新时不生成新连接ID。在寻找建议。

如果我们使用Persistent Connection类而不是集线器,那么会发生什么……在这种情况下,如果我们在客户端刷新页面,连接id将保持不变?请给我带路。 谢谢

推荐答案

SignalR允许您通过用户的IPrincipal.Identity.Name向用户发送消息。只需使用Clients.User(userName)而不是Clients.Client(connectionId)

如果您由于某种原因不能使用用户的IPrincipal.Identity.Name寻址,您可以创建您自己的IUserIdProvider。这是SignalR>=1.0.0中不再存在的IConnectionIdFactory的替换。

等效的IUserIdProvider如下所示:

public class MyConnectionFactory : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        if (request.Cookies["srconnectionid"] != null)
        {
            return request.Cookies["srconnectionid"];
        }

        return Guid.NewGuid().ToString();
    }
}

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var idProvider = new MyConnectionFactory();
        GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);

        app.MapSignalR();
    }
}

public class MyHub : Hub
{
    public Task Send(string userName, string message)
    {
        return Clients.User(userName).receive(message);
    }
}

在给定MyConnectionFactory的情况下欺骗用户将是微不足道的。您可以使用HMAC使其更安全。

理想情况下,您只需使用从IRequest.User.Identity.Name检索用户ID的default IUserIdProvider

这篇关于如何持久化SignalR连接ID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆