我正在尝试构建一个聊天应用程序,其中用户 ID 由其自动生成的 signalR 连接 ID 表示。页面刷新时,实例化新连接时连接 ID 会发生变化。有没有办法持久保存用户连接 ID 的状态,直到浏览器会话结束(即直到他结束客户端上的会话)。
有任何指南或文档吗?这确实会有帮助。
我是信号器新手。所以想通过谷歌来了解很多东西。从这个网址我得到了一个类似的片段http://kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/ http://kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/
他们说这是可能的。问题是,如果我们引用页面,信号器通常会创建一个新的连接 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;
}
我的疑问是它适用于所有信号器版本吗?如果不是,那么如何在新版本中处理它,特别是在页面刷新时不生成新的连接 ID。寻找建议。
如果我们使用持久连接类而不是集线器,那么会发生什么......在这种情况下,如果我们在客户端刷新页面,连接 ID 将持续存在?请指导。
谢谢
SignalR 允许您通过用户的方式向用户发送消息IPrincipal.Identity.Name
。只需使用Clients.User(userName)
代替Clients.Client(connectionId)
.
如果您出于某种原因无法使用用户的地址来称呼他们IPrincipal.Identity.Name
你可以创建自己的用户ID提供者 http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#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 https://en.wikipedia.org/wiki/Hash-based_message_authentication_code.
理想情况下,您只需使用默认 IUserIdProvider https://github.com/SignalR/SignalR/blob/2.1.2/src/Microsoft.AspNet.SignalR.Core/Infrastructure/PrincipalUserIdProvider.cs从中检索用户 IDIRequest.User.Identity.Name
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)