How to persist SignalR connection ID(如何持久化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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何持久化SignalR连接ID
				
        
 
            
        - C# 中多线程网络服务器的模式 2022-01-01
 - Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
 - 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
 - 如何用自己压缩一个 IEnumerable 2022-01-01
 - 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
 - WebMatrix WebSecurity PasswordSalt 2022-01-01
 - 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
 - C#MongoDB使用Builders查找派生对象 2022-09-04
 - MoreLinq maxBy vs LINQ max + where 2022-01-01
 - 输入按键事件处理程序 2022-01-01
 
						
						
						
						
						
				
				
				
				