SignalR+MongoDB实现用户留言即时推送

前言:

最近写了一个项目,要实现即时通讯功能,在网上查了一下有两种常见的实现方式:SignalR和WebSocket,SignalR是封装好的一个类库,有三种传输模式:LongLooping(长轮询)、WebSocket、Forever Frame(隐藏框架的长请求连接),它会根据浏览器的环境自动选择合适的传输方式(比如说低版本的IE浏览器不支持WebSocket,SiganlR就会采用长轮询的方式传输)。SiganlR的介绍可以在百度搜一下有很多,这篇博客简单的介绍一下如何用SiganlR实现一个实时的消息推送功能。

一开始用户留言是存到SqlServer中的,考虑到用户留言价值相对较低,数据量大的特点,用MongoDB在性能上比较有优势(不用写Sql了,干活好快)

实现步骤:


1.安装SignalR

Install-Package Microsoft.AspNet.SignalR

安装成功后会系统会新增对应的js文件

2.创建Connections文件夹,存放永久连接类和Startup.cs

创建永久连接类:

代码:

    public class ChatConnections : PersistentConnection
    {
        protected override Task OnConnected(IRequest request, string connectionId)
        {
            return null;
        }

        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            return Connection.Broadcast(data);
        }
    }

创建startup类,如果项目中已经有了就不用创建了

代码:

    public class Startup1
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR<ChatConnections>("/Connections/ChatConnections");
        }
    }

3.用户发送留言

SignalR推送消息给后台->留言写入MongoDB

1.页面引入jquery.signalR-2.4.0.js和jquery

js:

<script src="~/layer/layer.js"></script>
<script src="~/scripts/jquery-1.10.2.min.js"></script>
<script src="~/scripts/jquery.signalR-2.4.0.js"></script>
<script type="text/javascript">
    $(function () {
        //获取连接
        var connection = $.connection("/Connections/ChatConnections");
        //监听消息,用户端不用做处理
         connection.received(function (data) {
        });
     // Wire up Send button to call NewContosoChatMessage on the server.
        connection.start().done(function () {
            $("#btn1").click(function () {
                layer.msg(‘确定发起留言?‘, {
                    time: 0 //不自动关闭
                    , btn: [‘确定‘, ‘取消‘]
                    , btn1: function (index) {
                        //加载层
                        var index = layer.load(1, {
                            shade: [0.1, ‘#fff‘]
                        });
                        $.ajax({
                            type: "post",
                            url: "/User/Message/SendMessage",
                            data: $(‘#form1‘).serialize(),
                        }).success(function (message) {
                           //消息推送
                            connection.send(message);
                            layer.msg(message, { icon: 1 });
                            var index = parent.layer.getFrameIndex(window.name);//获取当前弹出层的层级
                            window.parent.location.reload();//刷新父页面
                            parent.layer.close(index);//关闭弹出层
                        }).fail(function (err) {
                            layer.msg(‘系统错误,请稍后重试‘, { icon: 2 });
                        })
                        layer.close(index)//关闭加载层
                    }, btn2: function (index) {
                        layer.close();
                    }
                });
            });
        });

    });
</script>     

控制器:

        public async Task<JsonResult> SendMessage(MessageReq req)
        {
            SessionModel session = SessionInfo.GetSession();
            var info = _mysqlRepository.GetUserInfo(session.UserCode);
            req.SendName = info.UserName;
            req.SendCode = info.UserCode;
            req.SendPhone = info.Phone;
            //写入MongoDB
            if (! await _mongoRepository.InsertMessage(req))
            {
                return Json("留言失败");
            }
            return Json("留言成功");
        }
        #endregion

4.管理员接收留言:

SignalR监听用户发送留言,刷新页面时查询MongoDB里是否有未读留言

js:

<script src="~/scripts/jquery.signalR-2.4.0.min.js"></script>
<script>
    $(function () {
        //监听用户发送留言
        var connection = $.connection("/Connections/ChatConnections");
        connection.received(function (data) {
            layer.closeAll();
            layer.open({
                type: 2,
                shade: [0],
                title: ‘您有新的留言‘,
                shadeClose: true,
                shade: false,
                area: [‘280px‘, ‘215px‘],
                content: [‘/Manager/Home/Ifarme‘, ‘no‘], //iframe的url,no代表不显示滚动条
                offset: ‘rb‘ //右下角弹出
            });
        });

        connection.start().done(function () {
        });
        //刷新页面查询是否有未读留言
        $.ajax({
            type: "post",
            url: "/Manager/Home/QueryExist"
        }).success(function (message) {
            if (message == "Yes") {
                layer.open({
                    type: 2,
                    shade: [0],
                    title: ‘您有新的留言‘,
                    shadeClose: true,
                    shade: false,
                    area: [‘280px‘, ‘215px‘],
                    content: [‘/Manager/Home/Ifarme‘, ‘no‘], //iframe的url,no代表不显示滚动条
                    offset: ‘rb‘ //右下角弹出
                });
            }
        }).fail(function (err) {
            layer.msg(‘未能读取未读留言‘, { icon: 2 });
        })
    });
</script>

控制器:

        /// <summary>
        /// 查询是否有未读留言
        /// </summary>
        /// <returns></returns>
        public async Task<JsonResult> QueryExist()
        {
            var result = await _msg.QueryExist();
            if (!result)
            {
                return Json("No");
            }
            return Json("Yes");
        }

点击留言标为已读:

        /// <summary>
        /// 标为已读
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<JsonResult> AlRead(string id)
        {
            if (! await _mongoRepository.AlRead(id))
            {
                return Json("操作失败", JsonRequestBehavior.AllowGet);
            }
            return Json("成功", JsonRequestBehavior.AllowGet);
        }

到这里用户->管理员的实时消息推送就实现了

效果图:

写在最后:博主本人也是最近刚学SignalR,说的有不对的地方,请各位大佬指点,相互学习,在此我也会深入的学习SignalR,后续会继续分享SignalR的学习记录

原文地址:https://www.cnblogs.com/quebra/p/10200766.html

时间: 2024-08-13 05:01:25

SignalR+MongoDB实现用户留言即时推送的相关文章

iOS - 判断用户是否允许推送通知(iOS7/iOS8)

(iOS8中用户开启的推送通知类型对应的是UIUserNotificationType(下边代码中UIUserNotificationSettings的types属性的类型),iOS7对应的是UIRemoteNotificationType) 此处以iOS8的UIUserNotificationType为例,(如下图)当本地通知或push/远程通知 推送时,这个常量指明了app如何去提醒用户(比如:Badge,Sound,Alert的组合) 那么如何获得呢,在iOS8中是通过types属性,[[

《百度URL即时推送工具》---让网页秒收

百度推出了一个即时推送接口,可以让你把网页马上推送给百度.这是百度4月份新出的全新的接口,不是那种sitemap权限,是每个网站默认都有的接口.如果顺利的话,一分钟内收录你提交的网页也不是问题.当然这种顺利是有前提的,网站权重高,原创度好等等. 这个接口的介绍可以访问百度站长平台的这篇文章: http://szzfk.com , http://www.szzfk.com ,http://www.szhzjzk.com 不过这个接口需要自己开发程序,所以我们开发了这个<百度URL即时推送工具>.

iOS技术点:判断用户是否开启推送开关/是否允许推送?

- (BOOL)isAllowedNotification { //iOS8 check if user allow notification if (IS_IOS_8) {// system is iOS8 UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings]; if (UIUserNotificationTypeNone != sett

161014、Comet4J介绍及使用(即时推送)

简介 Comet4J是一个微型的即时推送框架(类似于goeasy),它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6.7)放入WEB-INF\lib,客户端(JavaScript文件)引入到页面,那么你的应用就具备了向客户端推送信息的能力,而你仅需要在服务器端调用Comet4J所提供发送方法,信息就会被主动的推送到客户的浏览器上. 准备工作 下载服务端jar文件 Comet4J目前仅支持Tomcat6.7版本,根据您所使用的Tomcat版本下载[comet4j-

iOS用户点击推送消息进入应用后自动跳转到对应的ViewController

当iOS用户通过点击推送消息进入应用时,在AppDelegate的 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 我们可以通过 NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotific

php 加入即时推送功能

打开浏览器保持与服务器握手的websocket 之前用workerman接过很花时间,现在workerman对其代码做了优化->https://www.workerman.net/web-sender 下载后 Demo: 效果1: 接收消息页面:http://demos.workerman.net/web-sender/ 推送接口url:http://demos.workerman.net:2121/?type=publish&to=uid&content=content其中to为接

Asp.net SignalR 实现服务端消息推送到Web端

原文:http://www.cnblogs.com/wintersun/p/4148223.html 之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我们来实现服务端消息推送到Web端,   首先回顾一下它抽象层次图是这样的: 实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加简单. 为了获取更好的可伸缩性, 我们引入消息队列, 看如下

android 用signalr 实现推送服务

我做的app需要实现signalr 推送服务 有两种方法 一种人家已经给我们集成了还有视频教程 地址为 https://www.youtube.com/watch?v=f9ih_M7PC10  下载的程序在这 按照视频做,但是更新了我没成功完成 https://www.youtube.com/watch?v=f9ih_M7PC10 第二种自己集成 一共分两步 第一步我是在activity 里面实现接收服务器推送的数据 首先 google上面下载 java-client 地址 https://gi

SignalR Self Host+MVC等多端消息推送服务(2)

一.概述 上次的文章中我们简单的实现了SignalR自托管的服务端,今天我们来实现控制台程序调用SignalR服务端来实现推送信息,由于之前我们是打算做审批消息推送,所以我们的demo方向是做指定人发送信息,至于做聊天消息和全局广播,这里就不在进行演示了. 二.创建控制台客户端 1.在SignalRProject解决方案下新建一个名为Clinet的控制台 2.在程序包管理控制台中输入以下命令 1 Install-Package Microsoft.AspNet.SignalR.Client 3.