如何使用 signalR 向特定用户发送消息
How Can I Send Message To specific User with signalR
我的 signalR 有一些问题,我无法从集线器向特定用户发送消息。
我想这样做:
public void Send(string userToId, string userForId, string message)
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ChatHubs>();
//userForId - it is Session["UserId"]
context.Clients.User(userForId).updateMessages(message);
}
我已经读过这个主题:http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections,但我不清楚,因为我没有这个var name = Context.User.Identity.Name;
我在会话变量中有用户信息,第二个是当我得到 connectionId 时这样: var myClientId = $.connection.hub.id;
connectionId - 在我刷新页面或在我的项目中单击另一个菜单时更改。
我有一些问题:
1) 我可以在没有 connectionId 的情况下向特定用户发送消息吗(仅使用 session["UserId"])?
2) 一般而言,如何使用 SignalR 轻松地进行一对一消息传递?
P.S。我正在工作 ASP.NET MVC (C#)
您可以向没有连接ID 的所有用户发送广播消息。您只需要为每个用户分配一个唯一 ID,并将其作为消息参数发送。
SignalR 给每个客户端一个唯一的 ID 作为连接 ID。您可以使用该连接 ID,也可以在创建客户端时为客户端分配唯一 ID 并将其用作连接 ID。这取决于你想使用什么。
编辑
只需在您的 Hub Class 文件中更新您的方法.....
public void Send(string name, string message, string connectionid)
{
// Call the addNewMessageToPage method to update clients.
Clients.All.addNewMessageToPage(name, message, connectionid);
}
并且在您的客户端中,您可以在包含 SignalR 文件后更新添加代码:-
var chat = $.connection.chatHub;
chat.client.addNewMessageToPage = function (name, message, connectionid) {
if (connectionid == $('#connection').val()) {
// Do What You want Here...
};
};
// Get the user name and store it to prepend to messages.
$('#displayname').val(prompt('Enter your name:', ''));
$('#connection').val(prompt('Enter your ID:', ''));
// Set initial focus to message input box.
$('#message').focus();
// Start the connection.
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
// Call the Send method on the hub.
chat.server.send($('#displayname').val(), $('#message').val(), $('#connection').val());
// Clear text box and reset focus for next comment.
$('#message').val('').focus();
});
});
希望这对您有所帮助...
如果您想在 SignalR 中向特定用户发送消息,最简单的方法是使用表单身份验证。您还可以将自定义会话与表单身份验证一起使用。创建您的会话代码后立即放置此代码。
FormsAuthentication.SetAuthCookie(username.Trim(), false);
然后在 signalR 中,您可以使用此行向该用户发送消息:
var username = Context.User.Identity.Name;
context.Clients.User(username).updateMessages(message);
编辑:
对于你的问题,将用户名传递给此方法(接收者用户名)并将消息推送到那个 user.Then 你不需要提供 userForId,因为你已经有了 "var username = Context.User.Identity.Name;" 的发件人用户名。还有这个方法只会推送到接收者用户名的方法。如果你还想收到发件人的消息,你需要用户 "Caller" 并且你需要编写一个新函数来获取 javascript.I 中的来电消息希望它对你来说很清楚。
public void Send(string username, string message)
{
context.Clients.Caller.updateMessagesCaller(message);
context.Clients.User(username).updateMessages(message);
}
此消息只会显示 username.And 我的建议是在整个 project.Thanks 中使用 FormAuthentication 实现。
我的 signalR 有一些问题,我无法从集线器向特定用户发送消息。
我想这样做:
public void Send(string userToId, string userForId, string message)
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ChatHubs>();
//userForId - it is Session["UserId"]
context.Clients.User(userForId).updateMessages(message);
}
我已经读过这个主题:http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections,但我不清楚,因为我没有这个var name = Context.User.Identity.Name;
我在会话变量中有用户信息,第二个是当我得到 connectionId 时这样: var myClientId = $.connection.hub.id;
connectionId - 在我刷新页面或在我的项目中单击另一个菜单时更改。
我有一些问题: 1) 我可以在没有 connectionId 的情况下向特定用户发送消息吗(仅使用 session["UserId"])? 2) 一般而言,如何使用 SignalR 轻松地进行一对一消息传递?
P.S。我正在工作 ASP.NET MVC (C#)
您可以向没有连接ID 的所有用户发送广播消息。您只需要为每个用户分配一个唯一 ID,并将其作为消息参数发送。
SignalR 给每个客户端一个唯一的 ID 作为连接 ID。您可以使用该连接 ID,也可以在创建客户端时为客户端分配唯一 ID 并将其用作连接 ID。这取决于你想使用什么。
编辑
只需在您的 Hub Class 文件中更新您的方法.....
public void Send(string name, string message, string connectionid)
{
// Call the addNewMessageToPage method to update clients.
Clients.All.addNewMessageToPage(name, message, connectionid);
}
并且在您的客户端中,您可以在包含 SignalR 文件后更新添加代码:-
var chat = $.connection.chatHub;
chat.client.addNewMessageToPage = function (name, message, connectionid) {
if (connectionid == $('#connection').val()) {
// Do What You want Here...
};
};
// Get the user name and store it to prepend to messages.
$('#displayname').val(prompt('Enter your name:', ''));
$('#connection').val(prompt('Enter your ID:', ''));
// Set initial focus to message input box.
$('#message').focus();
// Start the connection.
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
// Call the Send method on the hub.
chat.server.send($('#displayname').val(), $('#message').val(), $('#connection').val());
// Clear text box and reset focus for next comment.
$('#message').val('').focus();
});
});
希望这对您有所帮助...
如果您想在 SignalR 中向特定用户发送消息,最简单的方法是使用表单身份验证。您还可以将自定义会话与表单身份验证一起使用。创建您的会话代码后立即放置此代码。
FormsAuthentication.SetAuthCookie(username.Trim(), false);
然后在 signalR 中,您可以使用此行向该用户发送消息:
var username = Context.User.Identity.Name;
context.Clients.User(username).updateMessages(message);
编辑:
对于你的问题,将用户名传递给此方法(接收者用户名)并将消息推送到那个 user.Then 你不需要提供 userForId,因为你已经有了 "var username = Context.User.Identity.Name;" 的发件人用户名。还有这个方法只会推送到接收者用户名的方法。如果你还想收到发件人的消息,你需要用户 "Caller" 并且你需要编写一个新函数来获取 javascript.I 中的来电消息希望它对你来说很清楚。
public void Send(string username, string message)
{
context.Clients.Caller.updateMessagesCaller(message);
context.Clients.User(username).updateMessages(message);
}
此消息只会显示 username.And 我的建议是在整个 project.Thanks 中使用 FormAuthentication 实现。