千家信息网

SignalR Self Host+MVC等多端消息推送服务的示例分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了SignalR Self Host+MVC等多端消息推送服务的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
千家信息网最后更新 2026年11月03日SignalR Self Host+MVC等多端消息推送服务的示例分析

这篇文章主要介绍了SignalR Self Host+MVC等多端消息推送服务的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、概述

由于项目需要,最近公司项目里有个模块功能,需要使用到即时获得审批通知;原本的设计方案是使用ajax对服务器进行定时轮询查询,刚刚开始数据量和使用量不大的时候还好,后来使用量的增加和系统中各种业务的复杂度增加,服务器的压力也越来越大,于是我想使用消息推送的方式替换掉ajax轮询查询,当有审批提交时,调用推送方法,将消息推送到下一审批人那,这样就减低了服务器的压力。

Signal 是微软支持的一个运行在.NET平台上的 html websocket 框架。它出现的主要目的是实现服务器主动推送消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息。而且SignalR的兼容性也是很强大的,这里不在多言。既然选择了SignalR,那么就开始干吧!

我的想法是将SignalR做成一个自托管的服务,和我们的b/s项目分离出来,这样的好处是,1、推送服务不依赖于iis,就算iis挂了,我们的推送服务还可以正常运行;2、我们可以多平台调用这个推送服务,多个项目都可以同时使用;

二、创建服务端

1、用VS创建一个名为 "SignalRProject" 的解决方案;

2、在 SignalRProject解决方案下新建一个名为Server的控制台

3、在程序包管理器控制台,输入如下命令

Install-Package Microsoft.AspNet.SignalR.SelfHost

4、输入如下命令:

Install-Package Microsoft.Owin.Cors

5、在Server控制台中添加UserInfo类,代码如下

using System;  namespace Server {  public class UserInfo  {   public string ConnectionId { get; set; }   public string UserName { get; set; }   public DateTime LastLoginTime { get; set; }  } }

6、在Server控制台中添加ChatHub类,代码如下

using Microsoft.AspNet.SignalR;using Microsoft.AspNet.SignalR.Hubs;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace Server{ [HubName("IMHub")] public class ChatHub : Hub {  // 静态属性  public static List OnlineUsers = new List(); // 在线用户列表  ///   /// 登录连线  ///   /// 用户Id  /// 用户名  public void Register(string userName)  {   var connnectId = Context.ConnectionId;   if (OnlineUsers.Count(x => x.ConnectionId == connnectId) == 0)   {    if (OnlineUsers.Any(x => x.UserName == userName))    {     var items = OnlineUsers.Where(x => x.UserName == userName).ToList();     foreach (var item in items)     {      Clients.AllExcept(connnectId).onUserDisconnected(item.ConnectionId, item.UserName);     }     OnlineUsers.RemoveAll(x => x.UserName == userName);    }    //添加在线人员    OnlineUsers.Add(new UserInfo    {     ConnectionId = connnectId,     UserName = userName,     LastLoginTime = DateTime.Now    });   }   // 所有客户端同步在线用户   Clients.All.onConnected(connnectId, userName, OnlineUsers);  }  ///   /// 发送私聊  ///   /// 接收方用户连接ID  /// 内容  public void SendPrivateMessage(string toUserName, string message)  {   var fromConnectionId = Context.ConnectionId;   var toUser = OnlineUsers.FirstOrDefault(x => x.UserName == toUserName);   var fromUser = OnlineUsers.FirstOrDefault(x => x.ConnectionId == fromConnectionId);   if (toUser != null )   {    Clients.Client(toUser.ConnectionId).receivePrivateMessage(fromUser.UserName, message);    Clients.Client(toUser.ConnectionId).receivePrivateMessage(message);   }   else   {    //表示对方不在线    Clients.Caller.absentSubscriber();   }  }  public void Send(string name, string message)  {   //Clients.All { get; } // 代表所有客户端   //Clients.AllExcept(params string[] excludeConnectionIds); // 除了参数中的所有客户端   //Clients.Client(string connectionId); // 特定的客户端,这个方法也就是我们实现端对端聊天的关键   //Clients.Clients(IList connectionIds); // 参数中的客户端   //Clients.Group(string groupName, params string[] excludeConnectionIds); // 指定客户端组,这个也是实现群聊的关键所在   //Clients.Groups(IList groupNames, params string[] excludeConnectionIds);参数中的客户端组   //Clients.User(string userId); // 特定的用户   //Clients.Users(IList userIds); // 参数中的用户   Console.WriteLine("ConnectionId:{0}, InvokeMethod:{1}", Context.ConnectionId, "Send");   Clients.All.addMessage(name, message);  }  ///   /// 连线时调用  ///   ///   public override Task OnConnected()  {   Console.WriteLine("客户端连接,连接ID是:{0},当前在线人数为{1}", Context.ConnectionId, OnlineUsers.Count+1);   return base.OnConnected();  }  ///   /// 断线时调用  ///   ///   ///   public override Task OnDisconnected(bool stopCalled)  {   var user = OnlineUsers.FirstOrDefault(u => u.ConnectionId == Context.ConnectionId);   // 判断用户是否存在,存在则删除   if (user == null)   {    return base.OnDisconnected(stopCalled);   }   Clients.All.onUserDisconnected(user.ConnectionId, user.UserName); //调用客户端用户离线通知   // 删除用户   OnlineUsers.Remove(user);   Console.WriteLine("客户端断线,连接ID是:{0},当前在线人数为{1}", Context.ConnectionId, OnlineUsers.Count);   return base.OnDisconnected(stopCalled);  }  public override Task OnReconnected()  {   return base.OnReconnected();  } }}

7、在Server控制台中添加Startup类,代码如下

using Microsoft.Owin.Cors;using Owin;namespace Server{ public class Startup {  public void Configuration(IAppBuilder app)  {   //允许CORS跨域   app.UseCors(CorsOptions.AllowAll);   app.MapSignalR();  } }}

8、修改Server控制台中添加Program类,代码如下

using Microsoft.Owin.Hosting;using System;namespace Server{ class Program {  static void Main(string[] args)  {   string url = "http://localhost:10086";//设定 SignalR Hub Server 对外的接口   using (WebApp.Start(url))//启动 SignalR Hub Server   {    Console.WriteLine("Server running on {0}", url);    Console.ReadLine();   }  } }}

9、F5运行起来

然后浏览器中访问http://localhost:10086/signalr/hubs

结果如下:

感谢你能够认真阅读完这篇文章,希望小编分享的"SignalR Self Host+MVC等多端消息推送服务的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

客户 客户端 服务 用户 推送 消息 控制台 在线 控制 代码 参数 服务器 篇文章 项目 方案 运行 示例 分析 人数 使用量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳九邦互联网科技有限公司 互联网 科技公司 高科技与互联网 上海挚品互联网科技 互联网与新科技 碳银互联网科技有限公司 北京大学互联网科技怎么样 成都铂石互联网科技做什么的 明优互联网科技有限公司 南通创西澳互联网科技有限公司 陕西云淼互联网科技公司 广东鹅鹅鹅互联网科技有限公司 上海同邻互联网科技有限公司规模 兰石爱特工业互联网科技分公司 科技互联网经济论坛 唐山双旺合互联网科技产业园 互联网的黑科技实验室 科技美学互联网 艺术 六子台科技互联网展会 小牛互联网科技有限公司地址 深圳科技互联网 广州凡科互联网科技 四个字互联网科技公司取名 996高科技互联网公司 翼展科技 首家互联网医院 科技大学互联网 中科明德北京互联网科技 中天科技中国工业互联网 珠海东科互联网科技有限公司 互联网的黑科技实验室
0