asp.net - 如何保留 SignalR 连接 ID

标签 asp.net signalr

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

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

我是信号器的新手。所以想知道很多东西搜索谷歌。从这个网址我得到了一个类似的片段 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。寻找建议。

如果我们使用持久连接类而不是集线器,那么会发生什么......在这种情况下,如果我们在客户端刷新页面,连接 ID 将持续存在?请指导。 谢谢

最佳答案

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

如果您出于某种原因无法使用用户的 IPrincipal.Identity.Name 来称呼用户,您可以创建自己的 IUserIdProvider .这是 IConnectionIdFactory 的替代品,它不再存在于 SignalR >= 1.0.0 中。

等效的 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 使其更安全.

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

关于asp.net - 如何保留 SignalR 连接 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27733946/

相关文章:

c# - 分布式系统上的 Asp.net Azure SignalR 服务

jquery - 如何开发类似堆栈溢出的通知系统

asp.net - 是否可以将 Wordpress 博客与 ASP.NET 集成?

c# - 更改位于 Asp :repeater 内的面板上的 Css 类

raphael - SignalR(使用Raphael js)$.connection.hub.start()计时问题

debugging - Visual Studio 2015 : Debug session does not terminate properly

SignalR 在对某些用户使用 WebSockets 或 ServerSentEvents 时给出 404,但对其他用户则不

asp.net - 看不到 ASP.NET 应用程序的真实错误消息?

c# - 从 SQL Server 请求 webform 中的 nvarchar 类型时出错

asp.net - 为什么 ASP.NET ListItem 类被密封?