当前位置: 首页 > news >正文

signalr推送消息

参考:Tutorial: Getting Started with SignalR 2 and MVC 5

环境:vs2013,webapi2,entity framework6.0

实现效果:当用户上传一个文件时候,推送消息给关注此用户的其他用户,告知此用户上传了一个新的文件。

推送原理:当前端用户打开网页时候,SignalR 服务端会自动生成一个guid类型的ConnectionId。此ConnectionId用来连接确定用户端,用来确定发送给哪个当前在线用户。当要推送消息时候,后端方法会根据这个ConnectionId来调动用户端的js方法,同时传递数据,利用用户端的js完成消息推送。

前端添加:

<script src="http://xxxx.com/jquery-1.6.4.min.js"></script>

<script src="http://xxxx.com/jquery.signalR-2.2.0.js"></script>

<script src="http://xxxx.com/signalr/hubs"></script>

另:

在前端的js中要有回调方法,供后端推送消息时候调用。类似:

 1 <script>
 2         $(function () {
 3             // Reference the auto-generated proxy for the hub.  
 4             var chat = $.connection.chatHub;
 5             // Create a function that the hub can call back to display messages.
 6             chat.client.addNewMessageToPage = function (name, message) {
 7                 // Add the message to the page. 
 8                 $('#discussion').append('<li><strong>' + htmlEncode(name) 
 9                     + '</strong>: ' + htmlEncode(message) + '</li>');
10             };
11          
12     </script>

 

后端过程:

1、在nuget中安装Microsoft.AspNet.SignalR

2、在项目根目录下会自动生成一个Startup.cs的类文件。如下配置:

 1  public void Configuration(IAppBuilder app)
 2         {
 3             // Branch the pipeline here for requests that start with "/signalr"
 4             app.Map("/signalr", map =>
 5             {
 6                 // Setup the CORS middleware to run before SignalR.
 7                 // By default this will allow all origins. You can 
 8                 // configure the set of origins and/or http verbs by
 9                 // providing a cors options with a different policy.
10                 map.UseCors(CorsOptions.AllowAll);
11                 var hubConfiguration = new HubConfiguration
12                 {
13                     // You can enable JSONP by uncommenting line below.
14                     // JSONP requests are insecure but some older browsers (and some
15                     // versions of IE) require JSONP to work cross domain
16                     // EnableJSONP = true
17                 };
18                 // Run the SignalR pipeline. We're not using MapSignalR
19                 // since this branch already runs under the "/signalr"
20                 // path.
21                 map.RunSignalR(hubConfiguration);
22             });
23 
24         }

 

3、添加新建项: 类型为:SignalR Hub Class (v2)。名称:PushHub.cs

在 PushHub.cs中,继承Hub抽象类。

在此类中,写发送消息的方法。类似:

 public void Send(List<PullMessageDto> data)
        {
            // Call the addNewMessageToPage method to update clients.
         
            //指定给某用户推送消息
             Clients.Client(user.ConnectionId).broadcastMessage(message);
           //给所有当前在线用户推送消息
            Clients.All.addNewMessageToPage(name, message);

        }

4、实现向指定用户推送消息。

这是在webApi2中,没有session,后端不保存用户是否在线状态。所以,这边当用户登录时候,前端把用户名和自动生成的ConnectionId发送到后端,后端保存到数据库中(用户名ConnectionId联合主键,每次登录都更新),当要推送的时候,就根据用户名查找ConnectionId,来实现定向推送。

在PushHub.cs中可以直接使用Clients类,但在其他类中,就得这样使用。

 IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<PushHub>();

在其他类中代码:

 1   public void PullMessage(string categoryId, string user)
 2         {
 3             ////查询订阅或关注用户
 4             List<string> list = new List<string>();
 5             var temp = IMediameta.GetPullMessageUsers(categoryId, user);
 6             IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<PushHub>();
 7            
 8             foreach (var item in temp)
 9             {
10                 var message = item;
11                 var json = new JavaScriptSerializer().Serialize(message);
12                 var connectionId = IMediameta.GetHubInfoByItCode(item.User);
13 
14                 if (!string.IsNullOrEmpty(connectionId))
15                 {
16                     _hubContext.Clients.Client(connectionId).broadcastMessage(message);
17                 }
18             }
19         }

前端还要有个broadcastMessage的js方法。参照以上addNewMessageToPage方法。

 

问题:

1、多服务器多数据库这边会出现推送问题,有些推送消息无法推送到。分为post服务器和get服务器,写数据库和读数据库。

转载于:https://www.cnblogs.com/heifengwll/p/6243491.html

相关文章:

  • 老鼠Atlas之旅(八):Hands-On Lab 4第四个实验,Atlas服务器控件自动完成
  • 使用hashids库混淆在url中与数据库相关的数字
  • 2005年互联网最具潜力奖
  • 腾讯财报不佳股价下挫 马化腾称SP业竞争激烈
  • Lua学习---Lua的控制结构
  • 被PQ点名了....
  • 分布式链路追踪系统预研第二篇
  • 001_SPL工作中总结
  • 精彩Blog
  • 软工期中测试简答题
  • VBScript语法错误详解
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • 最近的方向
  • 深度学习:识别图片中的电话号码(1)
  • X300等低端ATI显卡在Dapper的Gnome上使用XGL指南
  • 2017 年终总结 —— 在路上
  • android图片蒙层
  • Go 语言编译器的 //go: 详解
  • Java精华积累:初学者都应该搞懂的问题
  • Mysql5.6主从复制
  • Spring核心 Bean的高级装配
  • vue 配置sass、scss全局变量
  • Vue2 SSR 的优化之旅
  • 计算机在识别图像时“看到”了什么?
  • 前端面试题总结
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 正则表达式小结
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 通过调用文摘列表API获取文摘
  • #pragam once 和 #ifndef 预编译头
  • (13)Hive调优——动态分区导致的小文件问题
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (论文阅读11/100)Fast R-CNN
  • (五)网络优化与超参数选择--九五小庞
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .NET gRPC 和RESTful简单对比
  • .Net Winform开发笔记(一)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [ffmpeg] av_opt_set 解析
  • [FUNC]判断窗口在哪一个屏幕上
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)
  • [Godot] 3D拾取
  • [IE编程] 多页面基于IE内核浏览器的代码示例
  • [IOI2018] werewolf 狼人
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解
  • [LeeCode]-Divide Two Integers 不用乘除的除法运算
  • [mmucache]-ARMV8-aarch64的虚拟内存(mmutlbcache)介绍-概念扫盲