宝哥软件园

SignalR Self Host MVC等多终端消息推送服务(一)

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

一.概述

由于项目的需要,最近公司项目中有一个模块功能,需要马上使用才能拿到审批通知;最初的设计方案是使用ajax定期轮询服务器,但是刚开始数据量和使用量不大的时候还可以。后来随着使用量的增加和系统中各种业务的复杂化,服务器上的压力越来越大,我就想用消息推送代替ajax轮询查询。提交审批时,调用push方法将消息推送给下一个审批人,从而减轻服务器的压力。

Signal是一个由微软支持的html websocket框架,运行在。NET平台。它出现的主要目的是让服务器主动将消息推送到客户端页面,这样客户端就不需要重新发送请求或者使用轮询技术获取消息。而且SignalR的兼容性也很强,这里就不说了。既然你已经选择了信号员,我们就开始吧!

我的想法是让SignalR成为一个自托管服务,并将其从我们的b/s项目中分离出来。优点是:1。推送服务不依赖于iis,即使iis挂起,我们的推送服务仍然可以正常运行;2.我们可以在多个平台上调用这个推送服务,可以同时使用多个项目;

其次,创建一个服务器

废话少说。第一次写博客。在介绍了业务场景和想法之后,让我们开始编码。

1.用VS创建一个名为“SignalRProject”的解决方案;

2.在SignalRProject解决方案下创建名为“服务器”的新控制台

3.在包管理器控制台中,输入以下命令

安装-打包微软。自主机

4.输入以下命令:

安装-打包微软。奥因科尔斯

5.在服务器控制台中添加UserInfo类,代码如下

使用系统;命名空间服务器{公共类UserInfo {公共字符串ConnectionId { get设置;}公共字符串UserName { get设置;} public DateTime LastLoginTime { get;设置;} } }

6.在服务器控制台中添加ChatHub类,代码如下

使用微软。信号员;使用微软。信号中枢;使用系统;使用系统。集合。通用;使用系统Linq .使用系统。线程化。任务;服务器命名空间{ [HubName('IMHub')]公共类ChatHub : Hub { //静态属性公共静态listsureinfo online user=new listsureinfo();//在线用户列表///摘要///登录连线////summary///param name=' userId '用户Id/param ///param名称='用户名'用户名/param公共无效寄存器(字符串用户名){变量连接=上下文.ConnectionIdif (OnlineUsers .计数(x=x . connection id==connect id==0){ if(online users .任何(x=x . UserName==UserName)){ var items=在线用户.其中(x=x .用户名==用户名)。to list();foreach(项目中的定义变量项目){客户.所有异常(连接)。onUserDisconnected(项目连接标识,项目。用户名);}在线用户.全部删除(x=x . UserName==UserName);} //添加在线人员在线用户。添加(新用户信息{连接标识=连接标识,用户名=用户名,最后登录标识=日期时间. now });} //所有客户端同步在线用户客户所有. onConnected(连接、用户名、在线用户);} ///摘要///发送私聊////summary///param name=' toUserId '接收方用户连接ID/param ///param名称='消息'内容/param public void sendprivemessage(字符串Tousername,字符串消息){ var fromConnectionId=Context .ConnectionIdvar toUser=online users .first or default(x=x . UserName==Tousername);var fromUser=OnlineUsers .first or default(x=x . ConnectionId==Fromconnectionid);如果(头儿!=null){ 0客户端。客户端(图瑟.ConnectionId ).receivePrivateMessage(来自用户。用户名、消息);客户。客户端(图瑟.ConnectionId ).receivePrivateMessage(消息);} else { //表示对方不在线客户呼叫者。缺席订户();} }公共作废发送(字符串名称,字符串消息){//客户端.All { get} //代表所有客户端//客户端ALlexcept(params string[]排除connectionids);//除了参数中的所有客户端//客户端。客户端(字符串connectionID);//特定的客户端,这个方法也就是我们实现端对端聊天的关键//客户端。客户端(IListString connectionIdS);//参数中的客户端//客户端。组(字符串groupName,参数字符串[]排除连接);//指定客户端组,这个也是实现群聊的关键所在//客户端。组(IListstring groupNames,params string[]排除connectionids参数中的客户端组//客户端。用户(字符串UserID);//特定的用户//客户端。用户(IListString UserIdS);//参数中的用户控制台写入行(' connectionid : { 0 },InvokeMethod: { 1 } ',上下文.ConnectionId,‘Send’);客户All.addMessage(名称,消息);} ///摘要///连线时调用////摘要////返回/返回公共覆盖任务OnConnected() {控制台.WriteLine(“”客户端连接,连接身份是:{0},当前在线人数为"{1}",上下文ConnectionId,OnlineUsers .计数1);返回基地OnConnected();} ///摘要///断线时调用////summary////param name=' stop called '/param////returns/returns public override Task on disconnected(bool stop called){ var user=online users .first ordefault(u=u . ConnectionId==Context).ConnectionId);//判断用户是否存在,存在则删除if (user==null) { return base .断开连接时(停止呼叫);}客户All.onUserDisconnected(用户连接标识,用户。用户名);//调用客户端用户离线通知//删除用户在线用户。移除(用户);控制台WriteLine(“”客户端断线,连接身份是:{0},当前在线人数为"{1}",上下文ConnectionId,OnlineUsers .计数);返回基地断开连接时(停止呼叫);}公共覆盖任务OnReconnected(){ 0返回基数OnReconnected();} } }

7、在计算机网络服务器控制台中添加启动类,代码如下

使用微软哦。克-奥二氏分级量表使用欧文命名空间服务器{公共类启动{公共void Configuration(IAppBuilder应用){//允许克-奥二氏分级量表跨域应用程序.用户界面.允许穿墙);应用程序.mapsignor();} } }

8、修改计算机网络服务器控制台中添加程序类,代码如下

使用微软。主持;使用系统;命名空间服务器{ class Program { static void Main(string[]args){ string URL=' http://localhost :10086 ';//设定信号中枢服务器对外的接口使用(网络应用程序.开始(网址))//启动信号中枢服务器{控制台WriteLine(“{ 0 }”)上运行的服务器,网址);控制台ReadLine();} } } } }

9、F5运行起来

然后浏览器中访问http://localhost :10086/信号员/集线器

结果如下:

见上图内容就基本完成了,今天先讲到着,时间不早了,先休息了,后续有时间再将后面的文章补上

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+