如何保留 SignalR 连接 ID
How to persist SignalR connection ID
我正在尝试构建一个聊天应用程序,其中用户 ID 由他们自动生成的 signalR 连接 ID 表示。在页面刷新时,连接 ID 在实例化新连接时更改。有没有办法保持用户连接 ID 的状态,直到浏览器会话结束(即直到他在客户端结束会话)。
任何指南或文档?真的会有帮助。
我是信号员的新手。所以想知道很多东西搜索 Google。从这个 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;
}
我怀疑它是否适用于所有信号器版本?如果不是,那么如何在新版本中处理它,特别是在页面刷新时不生成新的连接 ID。寻找建议。
如果我们使用持久连接 class 而不是集线器,那么会发生什么......在这种情况下,如果我们在客户端刷新页面,连接 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.
使其更安全
理想情况下,您只需使用 default IUserIdProvider 从 IRequest.User.Identity.Name
检索用户 ID。
用户 ID 提供程序不起作用,因为连接 ID 不是来自它。我实现了一个解决方案 (https://weblogs.asp.net/ricardoperes/persisting-signalr-connections-across-page-reloads),它使用存储在会话存储中的伪会话 ID。然后将每个 SignalR 连接 ID 映射到此伪会话 ID。
我正在尝试构建一个聊天应用程序,其中用户 ID 由他们自动生成的 signalR 连接 ID 表示。在页面刷新时,连接 ID 在实例化新连接时更改。有没有办法保持用户连接 ID 的状态,直到浏览器会话结束(即直到他在客户端结束会话)。
任何指南或文档?真的会有帮助。
我是信号员的新手。所以想知道很多东西搜索 Google。从这个 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;
}
我怀疑它是否适用于所有信号器版本?如果不是,那么如何在新版本中处理它,特别是在页面刷新时不生成新的连接 ID。寻找建议。
如果我们使用持久连接 class 而不是集线器,那么会发生什么......在这种情况下,如果我们在客户端刷新页面,连接 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.
理想情况下,您只需使用 default IUserIdProvider 从 IRequest.User.Identity.Name
检索用户 ID。
用户 ID 提供程序不起作用,因为连接 ID 不是来自它。我实现了一个解决方案 (https://weblogs.asp.net/ricardoperes/persisting-signalr-connections-across-page-reloads),它使用存储在会话存储中的伪会话 ID。然后将每个 SignalR 连接 ID 映射到此伪会话 ID。