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
基础教程推荐
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- 将 XML 转换为通用列表 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01