集线器 SignalR.Core 消息推送实例

SignalR.Core 消息推送实例

在NuGet 包管理器中搜索 Microsoft.AspNetCore.SignalR 安装,根据项目环境在列表中选择对应的版本安装。目前我的项目的是.net core 的所以选择了 Core版本。

安装成功后在项目中就可以使用了。

public class ChatHub : Hub
{
    private string _className = "ChatHub";

    //private System.Threading.Timer timer = null;
    private System.Threading.Timer _timer = null;
    private static readonly object _lock = new object();

    /// <summary>
    /// 前端接口接收消息的方法名
    /// </summary>
    private string _receiveMsgmethod = "chatHubReceiveMsg";

    /// <summary>
    /// 前端接口注册用户的方法名
    /// </summary>
    private string _registerUserthod = "chatHubRegisterUsert";

    /// <summary>
    /// 系统消息发送人
    /// </summary>
    private string _sendUser = "system";

    private ITokenHelper _tokenHelper = new TokenHelper();

    /// <summary>
    /// 当连接成功时执行
    /// </summary>
    /// <returns></returns>
    public override Task OnConnectedAsync()
    {
        try
        {
            string connId = Context.ConnectionId;
            var tokenobj = Context.GetHttpContext().Request.Query["token"].ToString();
            var uid = Context.GetHttpContext().Request.Query["uid"].ToString();
            //读取配置文件中 的 秘钥
            var secretKey = ConfigManagerHelper.JwtTokenConfig["Secret"];
            if (!string.IsNullOrEmpty(tokenobj))
            {
                //var userId = string.Empty;                    
                //string token = tokenobj.Split(" ")[1].ToString();//剔除Bearer
                string mobile = "";//用户手机号
                                   //验证jwt,同时取出来jwt里边的用户ID
                //TokenType tokenType = _tokenHelper.ValiTokenState(token, secretKey
                //    , a => a["iss"] == "test.cn" && a["aud"] == "test"
                //    , action =>
                //    {
                //        userId = action["id"];
                //        //mobile = action["phone_number"];
                //    });
                var userModel = new OnlineUserModel() {
                    Token = tokenobj,
                    F_Id = uid,
                    ConnectionId = connId,
                    HubClients = Clients
                };
                OnlineUserService.Instance.AddOnlineUser(userModel);
                /*根据令牌获取用户的信息*/
                //{
                //    await RedisClient.Instance.SetAsync("缓存key-用户标识", this.Context.ConnectionId);
                //}
            }
            //_logger.LogWarning("SignalR已连接");
            //验证Token
            //var token = _accessor.HttpContext.Request.Query["access_token"];
            //var user = JwtHelper.SerializeJwt(token);
            //ApiLogQueueService.Instance.AddLog(_className, "OnConnectedAsync", ApiLogType.Warning, ProjectIdEnum.LDApi.GetHashCode(), 200, token, "SignalR已连接,用户名:" + CurrentUserName, string.Empty, 200, 0, CommonHelp.ServiceIp);
            //_logger.LogWarning("SignalR已连接,用户名:" + CurrentUserName);
            //连接用户 这里可以存在Redis
            //var model = new T_sys_userModel
            //{
            //    p_attribute1 = connId
            //};
            OnlineUserService.Instance.AddClients(connId, Clients);
            //var msgModel = new MessageModel()
            //{
            //    SendUserID = connId,
            //    SendUserName = secretKey,
            //    Msg = connId + "连接成功,uid:" + uid,
            //    Type = MessageTypeEnum.System.GetHashCode(),
            //    City = tokenobj
            //};
            //Clients.All.SendAsync("chatHubConnectResponse", _sendUser+ "OnConnectedAsync", msgModel);//connId + "连接成功"
            TimerSend();
        }
        catch (Exception ex)
        {
            ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
            {
                Search1 = "OnConnectedAsync",
                Search2 = string.Empty,
                ClassName = _className,
                Method = "OnConnectedAsync",
                Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
                RequestModel = string.Empty,
                ResponseModel = string.Empty,
                ElapsedTime = 0,
                Code = InterfaceName.ChatHub_SendMessageAsync.GetHashCode(),
                InterfaceNameEnum = InterfaceName.ChatHub_SendMessageAsync,
                ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
                ResultCode = 200,
                Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
                RowStatus = TrueOrFalseEnum.True.GetHashCode(),
                CreatedBy = "system",
                CreatedOn = DateTime.Now
            });
        }
        //给当前的连接分组 可以进行同一组接收消息 也可以用Token获取机构权限
        //await Groups.AddToGroupAsync(Context.ConnectionId, "测试组");

        //给当前连接返回消息 .Clients可以发多个连接ID
        //Clients.Client(connId).SendAsync("ConnectResponse",
        //    new AjaxResultModel<T_sys_userModel>()
        //    {
        //        state = 200,
        //        data = model,
        //        message = model.p_attribute1 + "连接成功"
        //    });

        return base.OnConnectedAsync();
    }

    /// <summary>
    /// 当连接断开时的处理
    /// </summary>
    public override Task OnDisconnectedAsync(Exception exception)
    {
        try
        {
            //var token = Context.GetHttpContext().Request.Query["token"].ToString();
            //var uid = Context.GetHttpContext().Request.Query["uid"].ToString();
            //var userModel = OnlineUserService.Instance.GetUserByConnectionId(connId);
            string connId = Context.ConnectionId;                
            OnlineUserService.Instance.RemoveClients(connId);
            //if (Clients != null)
            //{
            //    var msg = connId + "断开连接";
            //    if (userModel != null)
            //    {
            //        msg = userModel.F_RealName + "断开连接";
            //    }
            //    var msgModel = new MessageModel()
            //    {
            //        SendUserID = connId,
            //        SendUserName = string.Empty,
            //        Msg = msg + "uid:" + uid,
            //        Type = MessageTypeEnum.System.GetHashCode(),
            //        City = token
            //    };
            //    Clients.All.SendAsync("chatHubDisconnectResponse", _sendUser, msgModel);
            //}
        }
        catch (Exception ex)
        {
            ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
            {
                Search1 = "OnDisconnectedAsync",
                Search2 = string.Empty,
                ClassName = _className,
                Method = "OnDisconnectedAsync",
                Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
                RequestModel = string.Empty,
                ResponseModel = string.Empty,
                ElapsedTime = 0,
                Code = InterfaceName.ChatHub_SendMessageAsync.GetHashCode(),
                InterfaceNameEnum = InterfaceName.ChatHub_SendMessageAsync,
                ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
                ResultCode = 200,
                Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
                RowStatus = TrueOrFalseEnum.True.GetHashCode(),
                CreatedBy = "system",
                CreatedOn = DateTime.Now
            });
        }
        return base.OnDisconnectedAsync(exception);
    }

    /// <summary>
    /// 定时器
    /// </summary>
    /// <returns></returns>
    private void TimerSend()
    {
        //System.Threading.Timer t = new System.Threading.Timer(SendMessageAsync, null, 0, 1000);
        //if (_timer == null)
        //{
        //    lock (_lock)
        //    {
        //        if (_timer == null)
        //        {
        //            _timer = new System.Threading.Timer(SendMessageAsync, null, 0, 60000);
        //        }
        //    }
        //}
    }

    /// <summary>
    /// 发信息 ok
    /// </summary>
    /// <returns></returns>
    private void SendMessageAsync(object a)
    {
        try
        {
            var msg = "[" + CommonHelp.ServiceIp + "]系统消息:现在是" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            //var task = _hubClients.All.SendAsync("Show", "system", msg);
            //var task = hubClients.All.SendAsync(_receiveMsgmethod, "system", msg);
            var task = OnlineUserService.Instance.SendPublicMsg(msg, "systemId", "system");
            //task.Wait();

            //var msg = "系统消息:现在是" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var task =_hubContext.Clients.All.SendAsync("Show", "system", "系统消息:现在是" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            //var task = OnlineUser.Values.All.SendAsync("Show", "system", msg);
            //task.Wait();
            //if (Clients != null)
            //{
            //    //string userid = Guid.NewGuid().ToString();
            //    var msg = "系统消息:现在是" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            //    //var task =_hubContext.Clients.All.SendAsync("Show", "system", "系统消息:现在是" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            //    var task = Clients.All.SendAsync("Show", "system", msg);
            //    task.Wait();
            //    //var isSucceed = _userLoginLogService.Add(new Admin.Models.Tables.TB_UserLoginLogModel()
            //    //{
            //    //    F_Id = Guid.NewGuid().ToString("N"),
            //    //    F_ClientIP = msg,
            //    //    F_LoginTime = DateTime.Now,
            //    //    F_LoginType = "登录",
            //    //    F_ServiceType = "登录",
            //    //    F_UserId = "system",
            //    //});
            //    //var aa = isSucceed;
            //}
        }
        catch (Exception ex)
        {
            ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
            {
                Search1 = "SendMessageAsync",
                Search2 = string.Empty,
                ClassName = _className,
                Method = "SendMessageAsync",
                Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
                RequestModel = string.Empty,
                ResponseModel = string.Empty,
                ElapsedTime = 0,
                Code = InterfaceName.ChatHub_SendMessageAsync.GetHashCode(),
                InterfaceNameEnum = InterfaceName.ChatHub_SendMessageAsync,
                ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
                ResultCode = 200,
                Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
                RowStatus = TrueOrFalseEnum.True.GetHashCode(),
                CreatedBy = "system",
                CreatedOn = DateTime.Now
            });
        }
    }

    /// <summary>
    /// 开始计时器  前端调用 invoke
    /// </summary>
    private void startReminbScheduleTimer()
    {
        //设置定时间隔(毫秒为单位)
        //int interval = 3000;//60000一分钟
        //timer = new System.Timers.Timer(interval);
        设置执行一次(false)还是一直执行(true)
        //timer.AutoReset = true;
        设置是否执行System.Timers.Timer.Elapsed事件
        //timer.Enabled = true;
        绑定Elapsed事件 需要执行的事件
        //timer.Elapsed += new System.Timers.ElapsedEventHandler(ReminbSchedule);
        //timer.Start();
    }

    /// <summary>
    /// 日程提醒
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    //public async void ReminbSchedule(object sender, ElapsedEventArgs e)
    public void ReminbSchedule(object sender)
    {
        try
        {
            //获取需要此人需要提醒的日程 
            DateTime StartTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:00"));
            DateTime EndTime = StartTime.AddMinutes(1);

            //var taskPublicSendMsg = SendMsg("system", "[" + CommonHelp.ServiceIp + "]系统消息:现在是" + StartTime.ToString("yyyy-MM-dd HH:mm:ss"));
            //taskPublicSendMsg.Wait();
            var task = OnlineUserService.Instance.SendPublicMsg("[" + CommonHelp.ServiceIp + "]系统消息:现在是" + StartTime.ToString("yyyy-MM-dd HH:mm:ss"), "systemId", "system");
            //task.Wait();

            //var list = getRemindSchedule(StartTime, EndTime);
            if (Type = 1)//1系统消息 2 电子邮件 3 系统弹窗
            { 

            }

             var currentuserid = Context.UserIdentifier; 
            前端 判断Direct类型 为3时时日程提醒
            //foreach (var item in list)
            //{
            //    //IpAddress:日程ID      Time:(2 天前 · 日历 · 2021年12月28日 16:00 - 2021年12月28日 18:00)
            //    var timestr = LD.Code.Common.DateStringFromNow(item.RemindTime) + "· 日历 ·" + item.F_StartTime.ToString("yyyy年MM月dd日 HH:00") + " - " + item.F_EndTime.ToString("yyyy年MM月dd日 HH:00");
            //    var t = Clients.User(CurrentUserId).SendAsync("ReceiveMessage", new MessageModel() { UserID = CurrentUserId, Name = CurrentUserName, Msg = item.F_Title, Direct = 3, IpAddress = item.F_Id, Time = timestr });
            //    await Task.WhenAll(t);
            //    //标记为已提醒
            //    await UpdateRemind(item.ReminbId, item.IsEdit);
            //}
        }
        catch (Exception ex)
        {
            ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
            {
                Search1 = "ReminbSchedule",
                Search2 = string.Empty,
                ClassName = _className,
                Method = "ReminbSchedule",
                Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
                RequestModel = string.Empty,
                ResponseModel = string.Empty,
                ElapsedTime = 0,
                Code = InterfaceName.ChatHub_ReminbSchedule.GetHashCode(),
                InterfaceNameEnum = InterfaceName.ChatHub_ReminbSchedule,
                ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
                ResultCode = 200,
                Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
                RowStatus = TrueOrFalseEnum.True.GetHashCode(),
                CreatedBy = "system",
                CreatedOn = DateTime.Now
            });
        }
    }

    /// <summary>
    /// 给连接的所有人发送消息
    /// </summary>
    /// <param name="username"></param>
    /// <param name="message"></param>
    /// <returns></returns>
    //public Task SendMsg(string username, string message)
    //{
    //    //Show方法需要在前端实现
    //    return Clients.All.SendAsync("Show", username, message);
    //}

    /// <summary>
    /// 公共消息
    /// </summary>
    /// <param name="message"></param>
    /// <param name="sendUserId"></param>
    /// <param name="sendUserName"></param>
    /// <returns></returns>
    public async Task PublicSendMsg(string message, string sendUserId, string sendUserName)
    {
        // 后期考虑后台管理添加系统通知,这里来查 通知到链接的人
        //var hubClients = OnlineUserService.Instance.GetClient();
        //if (hubClients != null)
        //{
        //    var t1 = hubClients.All.SendAsync(_receiveMsgmethod, _sendUser, message);//new { Msg = message, Direct = 0 }
        //    var t2 = this.InsertMessage(0, CurrentUserId, userId, message); ;//添加历史记录
        //    await Task.WhenAll(t1);//, t2
        //}
        if (!string.IsNullOrEmpty(message) && !string.IsNullOrEmpty(sendUserId) && !string.IsNullOrEmpty(sendUserName))
        {
            var t1 = OnlineUserService.Instance.SendPublicMsg(message, sendUserId, sendUserName);
            //t1.Wait();
        }
    }

    /// <summary>
    /// 发送组消息
    /// </summary>
    /// <param name="groupId"></param>
    /// <param name="message"></param>
    /// <param name="sendUserId"></param>
    /// <param name="sendUserName"></param>
    /// <returns></returns>
    public async Task SendGroupMsg(string groupId,string message, string sendUserId, string sendUserName)
    {
        // 后期考虑后台管理添加系统通知,这里来查 通知到链接的人
        if (!string.IsNullOrEmpty(message) && !string.IsNullOrEmpty(sendUserId) && !string.IsNullOrEmpty(sendUserName))
        {
            var t1 = OnlineUserService.Instance.SendGroupMsg(groupId, message, sendUserId, sendUserName);
            //t1.Wait();
        }
    }

    /// <summary>
    /// 注册用户消息
    /// </summary>
    /// <param name="userId"></param>
    /// <param name="userName"></param>
    /// <param name="connectionId"></param>
    /// <returns></returns>
    public void RegisterUser(string userId, string userName, string connectionId)
    {
        try
        {
            // 后期考虑后台管理添加系统通知,这里来查 通知到链接的人
            var hubClients = OnlineUserService.Instance.GetClient();
            if (hubClients != null)
            {
                if (!string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(connectionId))
                {
                    OnlineUserService.Instance.AddOnlineUser(new OnlineUserModel()
                    {
                        F_Id = userId,
                        F_RealName = userName,
                        ConnectionId = connectionId
                    });
                    //userName + "注册成功"
                    var msgModel = new MessageModel()
                    {
                        SendUserID = "systemId",
                        SendUserName = "system",
                        Msg = userName + "注册成功",
                        Type = MessageTypeEnum.System.GetHashCode()
                    };
                    hubClients.All.SendAsync(_registerUserthod, "system", msgModel);
                }
            }
        }
        catch (Exception ex)
        {
            //写日志
            ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
            {
                Search1 = "RegisterUser",
                Search2 = string.Empty,
                ClassName = _className,
                Method = "RegisterUser",
                Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
                RequestModel = string.Empty,
                ResponseModel = string.Empty,
                ElapsedTime = 0,
                Code = InterfaceName.ChatHub_RegisterUser.GetHashCode(),
                InterfaceNameEnum = InterfaceName.ChatHub_RegisterUser,
                ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
                ResultCode = 200,
                Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
                RowStatus = TrueOrFalseEnum.True.GetHashCode(),
                CreatedBy = "system",
                CreatedOn = DateTime.Now
            });
        }
    }

    /// <summary>
    /// 加入案件组
    /// </summary>
    /// <param name="lawcaseId"></param>
    /// <param name="userId"></param>
    /// <returns></returns>
    public void JoinGroup(string lawcaseId, string userId)
    {
        try
        {
            if (!string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(lawcaseId))
            {
                if (lawcaseId.Contains(","))
                { 
                    var lawcaseIds = lawcaseId.Split(',').ToList();
                    foreach (var item in lawcaseIds)
                    {
                        if (!string.IsNullOrEmpty(item))
                        {
                            OnlineUserService.Instance.JoinGroup(item, userId);//, this.Groups
                        }
                    }
                }
                else
                {
                    OnlineUserService.Instance.JoinGroup(lawcaseId, userId);//, this.Groups
                }                    
            }
        }
        catch (Exception ex)
        {
            //写日志
            ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
            {
                Search1 = "JoinGroup",
                Search2 = string.Empty,
                ClassName = _className,
                Method = "JoinGroup",
                Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
                RequestModel = string.Empty,
                ResponseModel = string.Empty,
                ElapsedTime = 0,
                Code = InterfaceName.ChatHub_RegisterUser.GetHashCode(),
                InterfaceNameEnum = InterfaceName.ChatHub_RegisterUser,
                ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
                ResultCode = 200,
                Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
                RowStatus = TrueOrFalseEnum.True.GetHashCode(),
                CreatedBy = "system",
                CreatedOn = DateTime.Now
            });
        }
    }

    /// <summary>
    /// 加入案件组(批量)
    /// </summary>
    /// <param name="lawcaseId"></param>
    /// <param name="userId"></param>
    /// <returns></returns>
    //public void JoinGroupBatch(string lawcaseId, string userId)
    //{
    //    try
    //    {
    //        if (!string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(lawcaseId))
    //        {
    //            OnlineUserService.Instance.JoinGroup(lawcaseId, userId);//, this.Groups
    //        }
    //    }
    //    catch (Exception ex)
    //    {
    //        //写日志
    //        ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
    //        {
    //            Search1 = "JoinGroup",
    //            Search2 = string.Empty,
    //            ClassName = _className,
    //            Method = "JoinGroup",
    //            Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
    //            RequestModel = string.Empty,
    //            ResponseModel = string.Empty,
    //            ElapsedTime = 0,
    //            Code = InterfaceName.ChatHub_RegisterUser.GetHashCode(),
    //            InterfaceNameEnum = InterfaceName.ChatHub_RegisterUser,
    //            ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
    //            ResultCode = 200,
    //            Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
    //            RowStatus = TrueOrFalseEnum.True.GetHashCode(),
    //            CreatedBy = "system",
    //            CreatedOn = DateTime.Now
    //        });
    //    }
    //}

    /// <summary>
    /// 移除案件组
    /// </summary>
    /// <param name="lawcaseId"></param>
    /// <param name="userId"></param>
    /// <returns></returns>
    public void RemoveGroup(string lawcaseId, string userId)
    {
        try
        {
            if (!string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(lawcaseId))
            {
                OnlineUserService.Instance.RemoveGroup(lawcaseId, userId);//, this.Groups
            }
        }
        catch (Exception ex)
        {
            //写日志
            ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel()
            {
                Search1 = "RemoveGroup",
                Search2 = string.Empty,
                ClassName = _className,
                Method = "RemoveGroup",
                Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(),
                RequestModel = string.Empty,
                ResponseModel = string.Empty,
                ElapsedTime = 0,
                Code = InterfaceName.ChatHub_RegisterUser.GetHashCode(),
                InterfaceNameEnum = InterfaceName.ChatHub_RegisterUser,
                ProjectId = ProjectIdEnum.LDApi.GetHashCode(),
                ResultCode = 200,
                Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty,
                RowStatus = TrueOrFalseEnum.True.GetHashCode(),
                CreatedBy = "system",
                CreatedOn = DateTime.Now
            });
        }
    }

    /// <summary>
    /// 私聊
    /// </summary>
    /// <param name="receiveUserId"></param>
    /// <param name="message"></param>
    /// <param name="sendUserId"></param>
    /// <param name="sendUserName"></param>
    /// <returns></returns>
    //public async Task SendPrivateMsg(string receiveUserId, string message, string sendUserId, string sendUserName)
    //{
    //    var hubClients = OnlineUserService.Instance.GetClient();
    //    if (hubClients != null && string.IsNullOrEmpty(receiveUserId) && string.IsNullOrEmpty(message))
    //    {
    //        var model = OnlineUserService.Instance.GetUserByUserId(receiveUserId);
    //        if (model != null)
    //        {
    //            //var t1 = _hubClients.User(model.ConnectionId).SendAsync(_receiveMsgmethod, new MessageModel() { UserID = sendUserId, Name = sendUserName, Msg = message, Direct = 1 });
    //            var t2 = model.HubClients.Client(model.ConnectionId).SendAsync(_receiveMsgmethod, sendUserId, message);//new MessageModel() { UserID = sendUserId, Name = sendUserName, Msg = message, Direct = 2 }
    //            //var t3 = this.InsertMessage(1, CurrentUserId, userId, message);
    //            //await Task.WhenAll(t1, t2, t3);
    //            await Task.WhenAll(t2);
    //        }
    //    }
    //}

    /// <summary>
    /// 给指定房间内所有用户发消息
    /// </summary>
    /// <param name="roomid"></param>
    /// <param name="message"></param>
    /// <returns></returns>
    //public async Task SendGroupMessage(string roomid, string message)
    //{
    //    if (_hubClients != null)
    //    {
    //        var t1 = _hubClients.Group(roomid).SendAsync("ReceiveGroupMessage", new { UserID = CurrentUserId, Name = CurrentUserName, Msg = message });
    //        var t2 = this.InsertMessage(2, CurrentUserId, "", message);
    //        await Task.WhenAll(t1, t2);
    //    }
    //}
}

调用实例

/// <summary>
/// 新建案件事务 提交
/// </summary>
/// <param name="pinfo"></param>
/// <returns></returns>
[HttpPost]
[NoLDAPPLoginFilter]
public AjaxResult SubmitLawcase([FromBody] SubmitLawcaseViewModel pinfo)
{
    var sw = new Stopwatch();
    sw.Start();
    Exception exception = null;
    var rspModel = new AjaxResult();
    var loginUserId = CurrentUserId;
    try
    {
        var result = _serviceLawcase.SubmitLawcase(loginUserId, pinfo);
        if (!result.Item1)
        {
            return Error(result.Item2);
        }
        var lawcaseId = result.Item2;
        if (pinfo.JoinList != null && pinfo.JoinList.Count > 0)
        {
            //获取案由
            string causename = "";
            if(!string.IsNullOrEmpty(pinfo.CauseId))
            {
                var causeModel = _serviceCause.GetById(pinfo.CauseId);
                causename = causeModel.F_Name;
            }
            else
            {
                causename = pinfo.InputCause;

            }
            
            foreach (var item in pinfo.JoinList)
            {
                OnlineUserService.Instance.JoinGroup(lawcaseId, item.UserId);
            }
            //var sendMsg = string.Format("{0}案件创建成功", causeModel != null ? causeModel.F_Name : pinfo.Desc);
            var sendMsg = string.Format("{0}案件创建成功", causename);
            var task = OnlineUserService.Instance.SendGroupMsg(lawcaseId, sendMsg, loginUserId, CurrentUserName);
            //task.Wait();
        }
        //return Success(lawcaseId);
        rspModel.Success(lawcaseId);
    }
    catch (System.Exception ex)
    {
        //rspModel.Error("用户登录出错:", ex.Message);
        exception = ex;
        LogFactory.GetLogger("SubmitLawcase").Info("报错" + ex.Message);
        //return Error("新建案件事务 提交报错" + ex.Message);
    }
    AddLogElapsedTime(InterfaceName.Lawcase_SubmitLawcase, _className, "SubmitLawcase", pinfo, rspModel, rspModel.state, sw, exception, loginUserId);
    return rspModel;
}

Startup 中注册

public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
        IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting)
{    var apiUrlConfig = Configuration.GetSection("ApiUrl").Value;
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await Task.Run(() => { context.Response.Redirect("/index.html"); });
        });
        endpoints.MapControllers();
        //endpoints.MapHub<ServerHub>("/serverHub").RequireCors(t => t.WithOrigins(new string[] { apiUrlConfig }).AllowAnyMethod().AllowAnyHeader().AllowCredentials());
        endpoints.MapHub<ChatHub>("/chatHub").RequireCors(t => t.WithOrigins(new string[] { apiUrlConfig }).AllowAnyMethod().AllowAnyHeader().AllowCredentials());
        //endpoints.MapHub<ChatHub>("/serverHub").RequireCors(t => t.WithOrigins(new string[] { apiUrlConfig }).AllowAnyMethod().AllowAnyHeader().AllowCredentials());
        //endpoints.MapHub<ServerHub>("/serverHub").RequireCors(t => t.WithOrigins(new string[] { apiUrlConfig }).AllowAnyMethod().AllowAnyHeader().AllowCredentials());
    });
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在.NET Core 6中使用SignalR向前端发送消息是可行的。SignalR是一个实时通信库,可以通过WebSocket、Server-Sent Events(服务器推送事件)以及长轮询等方式,提供实时双向通信能力。 首先,你需要安装并配置SignalR。可以通过NuGet包管理器或在项目文件中手动添加相关依赖项来安装SignalR及其所需组件。 接下来,在后台代码中,你需要创建一个SignalR的Hub类,它将用于与前端进行通信。你可以在Hub类中定义服务器端的方法,以便在后台代码中触发并发送消息给前端实例。例如: ```csharp using Microsoft.AspNetCore.SignalR; public class MyHub : Hub { public void SendMessage(string message) { Clients.All.SendAsync("ReceiveMessage", message); } } ``` 在这个例子中,我们定义了一个名为`SendMessage`的服务器端方法。当调用这个方法时,它会将接收到的消息通过`ReceiveMessage`事件发送到所有连接的前端实例上。 然后,在前端代码中,你需要通过JavaScript或其他前端框架来连接到SignalR Hub,并订阅服务器端发送的事件,以便接收消息。例如: ```javascript const connection = new signalR.HubConnectionBuilder() .withUrl("/myHubUrl") .build(); connection.on("ReceiveMessage", (message) => { // 处理接收到的消息 console.log(message); }); connection.start() .then(() => { // 连接成功,在此处可以调用后台方法发送消息(如button click事件等) }) .catch((error) => { // 处理连接错误 console.error(error); }); ``` 在这个例子中,我们创建了一个SignalR连接,并在连接成功后订阅了`ReceiveMessage`事件,以便在接收到服务器端消息时进行处理。你可以在连接成功后的回调函数中调用后台方法,发送消息给前台实例。 最后,你可以通过调用后台方法来发送消息到前端实例,例如: ```csharp public class HomeController : Controller { private readonly IHubContext<MyHub> _hubContext; public HomeController(IHubContext<MyHub> hubContext) { _hubContext = hubContext; } public async Task<IActionResult> SendMessageToClients(string message) { await _hubContext.Clients.All.SendAsync("ReceiveMessage", message); return Ok(); } } ``` 在这个例子中,我们在控制器中注入了`IHubContext<MyHub>`,它允许我们调用与`MyHub`关联的方法,并向所有连接的前端实例发送消息。 综上所述,你可以通过SignalR在.NET Core 6中实现后台向前台实例发送消息的功能。具体实现细节可能会根据你的项目需求而有所不同,以上只是一个简单的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StevenChen85

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值