asp.net使用signalr实现集群集群下面的消息推送

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net使用signalr实现集群集群下面的消息推送相关的知识,希望对你有一定的参考价值。

1.选用Signalr的原因

  Signalr内部给我们做了很多封装。当服务器或者浏览器不支持websoket协议的时候就使用长连接方式  不支持长连接再选用轮询的方式获取消息

    websoket:与服务器保持长连接 服务器和客户端可以进行双工通讯而不用建立新的链接

    长连接:服务器与客户端保持长连接 。每隔一段时间客户端询问服务器  而不用建立新连接

   轮询:客户端定期向服务器发送请求询问 每次都会建立新的链接(建立新的链接使非常耗时的)

2.集群情况下的遇到的难点

  当一个一台服务器的给某个用户发送了一个消息如果判断用户是否在线(单台服务器很容易就实现了 但是用户在其他服务器登陆也是在线状态)

3.安装signalr

  (1) 通过NUGET搜索Signalr点击安装安装

  技术分享

  (2)安装会自动引入signalr的依赖类库和js

技术分享

4.配置signalr

  (1)页面配置(模板页和推送页面)

   技术分享

   (2)服务器端配置

      添加一个启动类

       技术分享

      添加一个PushHub类 继承Hub类

   技术分享

            现在我们看看AddUser方法的处理逻辑

          技术分享

       再看看RemoveUser的处理逻辑

        技术分享

       这时还需要在Push类里面增加几个方法

    技术分享

技术分享

准备一个api接口用于集群情况下的消息推送

技术分享

 这个时候我们的站点就部署好了。。

还需要一个类似中转站的api 当服务器发送消息就发送到这个api  这个api再调用每台服务器上面这个接口  如果其中一个返回true则表示已经推送了 不做任何处理  如果都返回false 则存入他的离线消息池(我项目里面用的是redis)

 

下面用一张图来展现集群情况下消息推送的设计思路

技术分享

 

 

 

部署signalr可能遇到的错误

 1.发布到正式后signarl/Hub 请求虚拟js 404

   可能是路径解析问题。而不是当做请求的一个虚拟js来处理  解决方法

   在Nuget 输入这段命令:Install-Package Microsoft.AspNet.SignalR.Utils  安装成功后 会在项目的packages\Microsoft.AspNet.SignalR.Utils.2.2.0\tools 文件下有个exe   在项目中新建一个文件夹复制进去

     

   

技术分享

技术分享

技术分享

 

 

$(ProjectDir)signalr\signalr.exe ghp path:$(TargetDir) /o:$(ProjectDir)Scripts/hubs.js

这样我们每当我们重新生成或者编译的时候就会自动更新Scripts下的hubs.js了

 

然后前端页面的那个路径就可以改了

技术分享

 

以上是关于asp.net使用signalr实现集群集群下面的消息推送的主要内容,如果未能解决你的问题,请参考以下文章

[Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能

SignalR集群采用Nginx进行负载均衡后连接失败

ASP.NET Core在支付宝小程序中使用signalR

使用 OWIN 的 ASP.NET WebApi 的有效 WebSockets 实现是啥? (不能是 SignalR。)

使用ASP.NET SignalR实现一个简单的聊天室

使用ASP.NET CORE SignalR实现APP扫描登录