C# 我没有收到发送到信号器组的消息
我有一个功能正常的信号器集线器,为了更好地控制消息传递,我在其中添加了组。除了组中的任何人都没有收到消息之外,这个集线器看起来非常简单。我正在使用SignalR for asp.net(非核心)v2.4.1(最新稳定版本)。我的集线器代码是:C# 我没有收到发送到信号器组的消息,c#,.net,signalr,signalr-hub,C#,.net,Signalr,Signalr Hub,我有一个功能正常的信号器集线器,为了更好地控制消息传递,我在其中添加了组。除了组中的任何人都没有收到消息之外,这个集线器看起来非常简单。我正在使用SignalR for asp.net(非核心)v2.4.1(最新稳定版本)。我的集线器代码是: using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.T
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR;
using SignalrHub;
using System.Data;
namespace SignalRChat
{
public class ChatHub : Hub
{
private static readonly List<User> Users = new List<User>();
public async override Task OnConnected()
{
string userName = Context.QueryString["username"];
string company = Context.QueryString["company"];
string department = Context.QueryString["department"];
string section = Context.QueryString["section"];
string firstname = Context.QueryString["firstname"];
string lastname = Context.QueryString["lastname"];
string connectionId = this.Context.ConnectionId;
var user = new User();
user.Name = userName;
user.firstname = firstname;
user.lastname = lastname;
user.company = company;
user.department = department;
user.section = section;
user.ConnectionIds = connectionId;
await JoinRoom(company.ToUpper()); // There's always a company, join the company room
if (section != "")
{
// If there's a section, join section room
await JoinRoom(company.ToUpper() + department.ToUpper() + section.ToUpper());
}
try
{
Users.Add(user);
}
catch (Exception ex)
{
var msg = ex.Message;
}
// TODO: Broadcast the connected user
// send list of connected users to client
// SendOne(connectionId,userName,"Welcome " + userName + System.Environment.NewLine + "Connected users are:" + System.Environment.NewLine);
string connectMessage = "";
foreach (var display in Users)
{
if (display.Name != userName)
{
connectMessage = connectMessage + display.Name + System.Environment.NewLine;
}
}
if (connectMessage == "")
{
connectMessage = "None";
}
SendOne(connectionId, userName, "Welcome " + userName + System.Environment.NewLine + "Connected users are:" + System.Environment.NewLine + connectMessage);
// SendOne(connectionId, userName, "This is to a specific user.");
// return base.OnConnected();
}
public override Task OnDisconnected(bool stopped)
{
string userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
var item = Users.Find(x => x.ConnectionIds == connectionId);
LeaveRoom(item.company.ToUpper()); // Leave company room
LeaveRoom(item.compny.ToUpper() + item.department.ToUpper() + item.section.ToUpper()); // Leave Section Room
Users.Remove(item); // remove from users
return base.OnDisconnected(true);
}
public void SendOne(string connectionId, string userName, string message)
{
Clients.Client(connectionId).broadcastMessage(userName, message);
}
public void Send(string name, string message)
{
// Call the broadcastMessage method to update clients.
Clients.All.broadcastMessage(name, message);
}
public void messageSection(string company, string department, string section, string name, string message)
{
string GroupName = company.ToUpper() + department.ToUpper() + section.ToUpper();
Clients.Group(GroupName).addChatMessage(name, message);
}
public void messageCompany(string company, string name, string message)
{
try
{
Clients.Group(company.ToUpper()).addChatMessage(name, message);
}
catch (Exception ex)
{
string errormsg = ex.Message;
}
}
public List<string> getConnectedUsers()
{
List<string> UserNames = new List<string>();
foreach (var ConnectedUser in Users)
{
UserNames.Add(ConnectedUser.Name + ": " + ConnectedUser.firstname + " " + ConnectedUser.lastname);
}
return UserNames;
}
public List<string> getConnectedSectionUsers(string company, string department, string section, string username)
{
List<string> UserNames = new List<string>();
foreach (var ConnectedUser in Users)
{
if (ConnectedUser.company.ToUpper() == company.ToUpper() && ConnectedUser.department.ToUpper() == department.ToUpper() && ConnectedUser.section.ToUpper() == section.ToUpper())
{
if (username.ToUpper() != ConnectedUser.Name.ToUpper())
{
UserNames.Add(ConnectedUser.Name + ": " + ConnectedUser.firstname + " " + ConnectedUser.lastname);
}
}
}
return UserNames;
}
public async Task JoinRoom(string roomName)
{
await Groups.Add(Context.ConnectionId, roomName);
}
public Task LeaveRoom(string roomName)
{
return Groups.Remove(Context.ConnectionId, roomName);
}
}
}
使用系统;
使用System.Collections.Concurrent;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用System.Web;
使用Microsoft.AspNet.signal;
使用SignalrHub;
使用系统数据;
名称空间信号呼叫
{
公共类聊天室:聊天室
{
私有静态只读列表用户=新列表();
已连接的公用异步覆盖任务()
{
字符串userName=Context.QueryString[“userName”];
字符串company=Context.QueryString[“company”];
string department=Context.QueryString[“department”];
string section=Context.QueryString[“section”];
string firstname=Context.QueryString[“firstname”];
字符串lastname=Context.QueryString[“lastname”];
字符串connectionId=this.Context.connectionId;
var user=新用户();
user.Name=用户名;
user.firstname=firstname;
user.lastname=lastname;
user.company=公司;
user.department=部门;
user.section=节;
user.connectionId=connectionId;
等待JoinRoom(company.ToUpper());//总有一家公司,加入公司吧
如果(节!=“”)
{
//如果有分区,加入分区室
等待JoinRoom(company.ToUpper()+department.ToUpper()+section.ToUpper());
}
尝试
{
用户。添加(用户);
}
捕获(例外情况除外)
{
var msg=例如消息;
}
//TODO:广播连接的用户
//将已连接用户的列表发送到客户端
//SendOne(connectionId,用户名,“Welcome”+用户名+System.Environment.NewLine+“连接的用户是:“+System.Environment.NewLine”);
字符串connectMessage=“”;
foreach(在用户中显示变量)
{
如果(display.Name!=用户名)
{
connectMessage=connectMessage+display.Name+System.Environment.NewLine;
}
}
如果(connectMessage==“”)
{
connectMessage=“无”;
}
SendOne(connectionId,用户名,“欢迎”+用户名+系统环境.NewLine+“连接的用户是:”+系统环境.NewLine+连接消息);
//SendOne(connectionId,用户名,“这是给特定用户的”);
//返回base.OnConnected();
}
已断开连接的公共覆盖任务(bool已停止)
{
字符串userName=Context.User.Identity.Name;
字符串connectionId=Context.connectionId;
var item=Users.Find(x=>x.connectionId==connectionId);
离开房间(item.company.ToUpper());//离开公司房间
离开会议室(item.compny.ToUpper()+item.department.ToUpper()+item.section.ToUpper());//离开会议室
Users.Remove(item);//从用户中删除
返回base.OnDisconnected(true);
}
public void SendOne(字符串连接ID、字符串用户名、字符串消息)
{
Clients.Client(connectionId).broadcastMessage(用户名,消息);
}
公共无效发送(字符串名称、字符串消息)
{
//调用broadcastMessage方法来更新客户端。
Clients.All.broadcastMessage(名称、消息);
}
public void messageSection(字符串公司、字符串部门、字符串部分、字符串名称、字符串消息)
{
字符串GroupName=company.ToUpper()+department.ToUpper()+section.ToUpper();
Clients.Group(GroupName).addChatMessage(name,message);
}
public void messageCompany(字符串公司、字符串名称、字符串消息)
{
尝试
{
Clients.Group(company.ToUpper()).addChatMessage(name,message);
}
捕获(例外情况除外)
{
字符串errormsg=ex.Message;
}
}
公共列表getConnectedUsers()
{
列表用户名=新列表();
foreach(用户中的var ConnectedUser)
{
UserNames.Add(ConnectedUser.Name+:“+ConnectedUser.firstname+”“+ConnectedUser.lastname);
}
返回用户名;
}
公共列表getConnectedSectionUsers(字符串公司、字符串部门、字符串部分、字符串用户名)
{
列表用户名=新列表();
foreach(用户中的var ConnectedUser)
{
if(ConnectedUser.company.ToUpper()==company.ToUpper()&&ConnectedUser.department.ToUpper()==department.ToUpper()&&ConnectedUser.section.ToUpper()==section.ToUpper())
{
if(username.ToUpper()!=ConnectedUser.Name.ToUpper())
{
UserNames.Add(ConnectedUser.Name+:“+ConnectedUser.firstname+”“+ConnectedUser.lastname);
}
}
}
返回用户名;
}
公共异步任务JoinRoom(字符串roomName)
{
等待组。添加(Context.ConnectionId,roomName);
}
公共任务室(字符串roomName)
{
返回组.Remove(Context.ConnectionId,roomName);
}
}
}
我设置断点并查看用户是否被添加到组中(我假设没有生成错误),以及消息是否正确发送到公司/部门