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中要有回调方法,供后端推送消息时候调用。类似:
<script>
$(function () {
// Reference the auto-generated proxy for the hub.
var chat = $.connection.chatHub;
// Create a function that the hub can call back to display messages.
chat.client.addNewMessageToPage = function (name, message) {
// Add the message to the page.
$('#discussion').append('<li><strong>' + htmlEncode(name)
+ '</strong>: ' + htmlEncode(message) + '</li>');
}; </script>
后端过程:
1、在nuget中安装Microsoft.AspNet.SignalR
2、在项目根目录下会自动生成一个Startup.cs的类文件。如下配置:
public void Configuration(IAppBuilder app)
{
// Branch the pipeline here for requests that start with "/signalr"
app.Map("/signalr", map =>
{
// Setup the CORS middleware to run before SignalR.
// By default this will allow all origins. You can
// configure the set of origins and/or http verbs by
// providing a cors options with a different policy.
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
// You can enable JSONP by uncommenting line below.
// JSONP requests are insecure but some older browsers (and some
// versions of IE) require JSONP to work cross domain
// EnableJSONP = true
};
// Run the SignalR pipeline. We're not using MapSignalR
// since this branch already runs under the "/signalr"
// path.
map.RunSignalR(hubConfiguration);
}); }
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>();
在其他类中代码:
public void PullMessage(string categoryId, string user)
{
////查询订阅或关注用户
List<string> list = new List<string>();
var temp = IMediameta.GetPullMessageUsers(categoryId, user);
IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<PushHub>(); foreach (var item in temp)
{
var message = item;
var json = new JavaScriptSerializer().Serialize(message);
var connectionId = IMediameta.GetHubInfoByItCode(item.User); if (!string.IsNullOrEmpty(connectionId))
{
_hubContext.Clients.Client(connectionId).broadcastMessage(message);
}
}
}
前端还要有个broadcastMessage的js方法。参照以上addNewMessageToPage方法。
问题:
1、多服务器多数据库这边会出现推送问题,有些推送消息无法推送到。分为post服务器和get服务器,写数据库和读数据库。
signalr推送消息的更多相关文章
- SqlDependency数据库同步+signalr 推送消息
sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...
- SignalR 实时推送消息
业务场景 以前做过一个东西,就是当数据库有数据更新的时候,能够自动更新到前台,那时候signalr还没出现的时候,需要自己实现轮询读库,对于数据库和程序都是比较郁闷的事情.现在利用SignalR解决数 ...
- SignalR推送服务在Android的实现 SignalA
SignalA是老外写的用于实现.net端推送消息至安卓端的实现,支持版本为android 2.3或以上,由于我的版本最低是2.2,所以只有把源码下下来自己改,如果你觉得太多了可自己编译成jar引用, ...
- Asp.net Core3.1+Vue 使用SignalR推送数据
本文就简单使用 往前端页面推送消息 SignalR 是什么 SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Serv ...
- 使用PushSharp给iOS应用推送消息
PushSharp是一个C#编写的服务端类库,用于推送消息到各种客户端,支持iOS(iPhone/iPad).Android.Windows Phone.Windows 8.Amazo.Blackbe ...
- android不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言
在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...
- 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)
这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...
- iOS点击推送消息跳到应用指定页面
现在的推送用的越来越频繁,几乎每个应用都开始用到了.其实又有几个用户会去看推送消息呢?没办法,产品经理最大啊,只是苦了我们这一帮程序员啊!闲话少说,进入正题.兄弟我用的是极光推送,自然是以极光推送为例 ...
随机推荐
- KB,Kb单位换算,网络带宽中的Kbps和KB/s到底是什么意思? (注:B和b的区别)
B是指字节(Byte)1个字节有8个比特组成 b是指比特(bit)代表一个2进制位(值为0或1) 上过网的朋友应该会听说过网络带宽这个词,可是这个网络带宽的单位到底是什么,为什么有的人说Kbps ...
- Hadoop2.6.0安装 — 集群
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6034187.html 这里写点 Hadoop2.6.0集群的安装和简单配置,一方面是为自 ...
- jQuery:年月日三级联动
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs ...
- js去掉字符串的空格
//去左空格; function ltrim(s){ return s.replace(/(^s*)/g, ""); } //去右空格; function rtrim(s){ re ...
- ArcGIS中的坐标系统定义与投影转换【转】
ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...
- javascript 实现des解密加密
//Paul Tero, July 2001 //http://www.tero.co.uk/des/ // //Optimised for performance with large blocks ...
- Handler.sendMessage 与 Handler.obtainMessage.sendToTarget比较
原文地址: http://www.cnblogs.com/android007/archive/2012/05/10/2494766.html 话说在工作中第一次接触android 的Handler ...
- Android开发--异步加载
因为移动端软件开发思维模式或者说是开发的架构其实是不分平台和编程语言的,就拿安卓和IOS来说,他们都是移动前端app开发展示数据和用户交互数据的数据终端,移动架构的几个大模块:UI界面展示.本地数据可 ...
- 学习 AppFuse
1.Appfuse是个什么鬼? AppFuse是一个集成了当前最流行的Web应用框架的一个更高层次的Web开发框架.换句话说,AppFuse就是一个完整的各主流框架的整合版本.AppFuse总是能够紧 ...
- Linux SendMail服务启动慢总结
在 CentOS release 6.6 上启动sendmail服务时发现服务启动过程非常慢,基本上要耗费3分多钟.有点纳闷:什么原因导致sendmail启动这么慢?搜索了这方面的一些资料,结合自己的 ...