消息不会发送到组 signalr
Messages are not sent to groups signalr
在 signalr 中处理消息时遇到一些问题,无法与组一起工作,所以当它有这样的形式时它可以工作:
Clients.All.received(new { sender = sender, message = message, isPrivate = false });
在我的项目中我有房间,所以当我尝试向群组发送消息时它们没有显示在页面上:
Clients.Group(chatuser.CurrentGroup).received(new { sender = sender, message = message, isPrivate = false });
这里是javascript的一小部分:
chatHub.client.received = function (message) {
viewModel.messages.push(new Message(message.sender, message.message, message.isPrivate, 'normalMessage'));
};
如果您需要查看更多代码,请告诉我,我将使用 javascript.
的完整文件更新我的所有 chathub 代码和模型
更新 2.
聊天用户:
public ChatUser(string group) {
CurrentGroup = group;
}
public ChatUser()
: this("Lobby")
{
}
public string nameOfGroup { get; set; }
public int authorID { get; set; }
public List<string> chatGroup { get; set; }
public string CurrentGroup { get; set; }
public string userLogin { get; set; }
public HashSet<string> ConnectionIds { get; set; }
Chathub.cs
private void SendGroupMessage(ChatUser user, string message)
{
Clients.Group(user.CurrentGroup).received(user.userLogin, message);
}
public void Send(string message)
{
var user = GetUser(Context.User.Identity.Name);
SendGroupMessage(user, message);
}
public override Task OnConnected()
{
string userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
var user = chatUsers.GetOrAdd(userName, _ => new ChatUser
{
userLogin = userName,
ConnectionIds = new HashSet<string>()
});
lock (user.ConnectionIds)
{
user.ConnectionIds.Add(connectionId);
// Or you might want to only broadcast this info if this
// is the first connection of the user
if (user.ConnectionIds.Count == 1)
{
Clients.Others.userConnected(userName);
}
}
return base.OnConnected();
}
public Task JoinGroup(string groupName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
//Join new Group
user.CurrentGroup = groupName;
//await
return Groups.Add(connectionGrpToString, user.CurrentGroup);
}
public Task LeaveRoom(string roomName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
var oldGroup = user.CurrentGroup;
//Tell everyone user is leaving
var message = string.Format("{0} has left.", user.userLogin);
SendGroupAlert(user, message);
//remove user from the group
//await
return Groups.Remove(connectionGrpToString, oldGroup); ;
}
一小部分重做了Chat.js:
function Message(from, msg, template) {
this.from = ko.observable(from);
this.message = ko.observable(msg);
this.template = ko.observable(template);
}
chatHub.client.received = function (sender, message) {
// Add the message to the page.
viewModel.messages.push(new Message(sender, message, 'normalMessage'));
};
以及chat.cshtml的观点:
<div class="col-md-12">
<div class="form-search">
<input type="text" id="txtMsg" class="input-xxlarge" disabled="disabled" placeholder="send" />
<button type="button" id="btnSend" class="btn btn-info" disabled="disabled">Send</button>
</div>
</div>
<div class="col-md-10">
<ul id="normalMessage" data-bind="foreach: messages">
<li>
<strong><span data-bind="text: from"></span>: </strong>
<span data-bind="text: message"></span>
</li>
</ul>
</div>
更新 3.
也许我错过了一些东西,但也显示了房间页面的代码以及它如何重定向我,我还发现当我选择我想加入的房间时,它会转到方法 JoinGroup
并在参数 groupName
它正确地显示了我选择的内容,但是在我要发送消息之后,在 user.CurrentGroup
它显示了默认的大厅..
Rooms.cshtml:
<div id="nav">
<div id="rooms" class="well well-small">
<ul class="nav nav-list">
<li class="nav-header">Rooms</li>
@foreach (var item in Model)
{
<li data-value=@item.Name>@Html.ActionLink("Room: " + item.Name, "Chat", "Home")</li>
}
</ul>
</div>
</div>
以及我如何加入 chat.js:
var roomKey = $(this).data('value');
chatHub.server.joinGroup(roomKey);
我认为你的问题出在这部分,问题是逻辑错误
public Task JoinGroup(string groupName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
//Join new Group
user.CurrentGroup = groupName;
//await
return Groups.Add(connectionGrpToString, user.CurrentGroup);
}
这里是你的 fetech 用户信息,然后将组名分配给它,然后将用户添加到该组。
一切正常,但您忘记使用组名更新您的用户列表。
您指定群组名称
//Join new Group
user.CurrentGroup = groupName;
但在您的列表中,用户仍然没有
中的组名
//Join new Group
user.CurrentGroup = groupName;
当您从 GetUser
的发送方法中拉取用户时
public void Send(string message)
{
var user = GetUser(Context.User.Identity.Name);
SendGroupMessage(user, message);
}
找不到用户的组名,因为您没有更新用户列表中的组名
在 signalr 中处理消息时遇到一些问题,无法与组一起工作,所以当它有这样的形式时它可以工作:
Clients.All.received(new { sender = sender, message = message, isPrivate = false });
在我的项目中我有房间,所以当我尝试向群组发送消息时它们没有显示在页面上:
Clients.Group(chatuser.CurrentGroup).received(new { sender = sender, message = message, isPrivate = false });
这里是javascript的一小部分:
chatHub.client.received = function (message) {
viewModel.messages.push(new Message(message.sender, message.message, message.isPrivate, 'normalMessage'));
};
如果您需要查看更多代码,请告诉我,我将使用 javascript.
的完整文件更新我的所有 chathub 代码和模型更新 2. 聊天用户:
public ChatUser(string group) {
CurrentGroup = group;
}
public ChatUser()
: this("Lobby")
{
}
public string nameOfGroup { get; set; }
public int authorID { get; set; }
public List<string> chatGroup { get; set; }
public string CurrentGroup { get; set; }
public string userLogin { get; set; }
public HashSet<string> ConnectionIds { get; set; }
Chathub.cs
private void SendGroupMessage(ChatUser user, string message)
{
Clients.Group(user.CurrentGroup).received(user.userLogin, message);
}
public void Send(string message)
{
var user = GetUser(Context.User.Identity.Name);
SendGroupMessage(user, message);
}
public override Task OnConnected()
{
string userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
var user = chatUsers.GetOrAdd(userName, _ => new ChatUser
{
userLogin = userName,
ConnectionIds = new HashSet<string>()
});
lock (user.ConnectionIds)
{
user.ConnectionIds.Add(connectionId);
// Or you might want to only broadcast this info if this
// is the first connection of the user
if (user.ConnectionIds.Count == 1)
{
Clients.Others.userConnected(userName);
}
}
return base.OnConnected();
}
public Task JoinGroup(string groupName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
//Join new Group
user.CurrentGroup = groupName;
//await
return Groups.Add(connectionGrpToString, user.CurrentGroup);
}
public Task LeaveRoom(string roomName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
var oldGroup = user.CurrentGroup;
//Tell everyone user is leaving
var message = string.Format("{0} has left.", user.userLogin);
SendGroupAlert(user, message);
//remove user from the group
//await
return Groups.Remove(connectionGrpToString, oldGroup); ;
}
一小部分重做了Chat.js:
function Message(from, msg, template) {
this.from = ko.observable(from);
this.message = ko.observable(msg);
this.template = ko.observable(template);
}
chatHub.client.received = function (sender, message) {
// Add the message to the page.
viewModel.messages.push(new Message(sender, message, 'normalMessage'));
};
以及chat.cshtml的观点:
<div class="col-md-12">
<div class="form-search">
<input type="text" id="txtMsg" class="input-xxlarge" disabled="disabled" placeholder="send" />
<button type="button" id="btnSend" class="btn btn-info" disabled="disabled">Send</button>
</div>
</div>
<div class="col-md-10">
<ul id="normalMessage" data-bind="foreach: messages">
<li>
<strong><span data-bind="text: from"></span>: </strong>
<span data-bind="text: message"></span>
</li>
</ul>
</div>
更新 3.
也许我错过了一些东西,但也显示了房间页面的代码以及它如何重定向我,我还发现当我选择我想加入的房间时,它会转到方法 JoinGroup
并在参数 groupName
它正确地显示了我选择的内容,但是在我要发送消息之后,在 user.CurrentGroup
它显示了默认的大厅..
Rooms.cshtml:
<div id="nav">
<div id="rooms" class="well well-small">
<ul class="nav nav-list">
<li class="nav-header">Rooms</li>
@foreach (var item in Model)
{
<li data-value=@item.Name>@Html.ActionLink("Room: " + item.Name, "Chat", "Home")</li>
}
</ul>
</div>
</div>
以及我如何加入 chat.js:
var roomKey = $(this).data('value');
chatHub.server.joinGroup(roomKey);
我认为你的问题出在这部分,问题是逻辑错误
public Task JoinGroup(string groupName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
//Join new Group
user.CurrentGroup = groupName;
//await
return Groups.Add(connectionGrpToString, user.CurrentGroup);
}
这里是你的 fetech 用户信息,然后将组名分配给它,然后将用户添加到该组。
一切正常,但您忘记使用组名更新您的用户列表。
您指定群组名称
//Join new Group
user.CurrentGroup = groupName;
但在您的列表中,用户仍然没有
中的组名 //Join new Group
user.CurrentGroup = groupName;
当您从 GetUser
public void Send(string message)
{
var user = GetUser(Context.User.Identity.Name);
SendGroupMessage(user, message);
}
找不到用户的组名,因为您没有更新用户列表中的组名