1. 前言

本文是根据网上前人的总结得出的。

环境: SignalR2.x,VS2015,Win10

2. 开始开发

1)新建一个MVC项目,叫做SignalRDemo

2)安装SignalR包

Install-Package Microsoft.AspNet.SignalR

Install-Package Microsoft.AspNet.SignalR.Client

安装完包后会有相应的引用和js文件

3)新建startup文件,用来启动SignalR

代码如下:

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin; [assembly: OwinStartup(typeof(SignalRDemo.SignalR.StartupSignalR))] namespace SignalRDemo.SignalR
{
public class StartupSignalR
{
public void Configuration(IAppBuilder app)
{
// 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
app.MapSignalR();//启动SignalR
}
}
}

4)新建Hub类,MyHub。此类的作用是用来与客户端的连接。

可以看到[HubName("myHub")]的注解,是用来与前端JS做绑定

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs; namespace SignalRDemo.SignalR
{ [HubName("myHub")]
public class MyHub : Hub
{ //当连接hub实例时被调用
public override Task OnConnected()
{
string connId = Context.ConnectionId;
return base.OnConnected();
} //当失去连接或链接超时时被调用
public override Task OnDisconnected(bool stopCalled)
{
//stopCalled=true时,客户端关闭连接
//stopCalled=false时,出现链接超时
return base.OnDisconnected(stopCalled);
} //重新连接时被调用
public override Task OnReconnected()
{
return base.OnReconnected();
} }
}

上面已经新建了与前端连接类。下面我们开始不同的调用方式

至此,我们创建环境已经结束。

3. 不同调用方式

1)前端调用后端

前端html:

myHub是HubName注解属性。2个js一定要引用:Jquery、SignalR。scripts中有src='/SignalR/hubs',其中SignalR是我们服务器端的文件夹,hubs是不存在的文件夹。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8"/>
<script src="/scripts/jquery-1.10.2.min.js"></script>
<!--Reference the SignalR library. -->
<script src="/scripts/jquery.signalR-2.2.1.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src='/SignalR/hubs'></script>
<!--Add script to update the page and send messages.-->
<script type='text/javascript'>
$(function () {
//引用自动生成的代理,myHub是HubName注解属性
var myHub = $.connection.myHub;
//开始连接
$.connection.hub.start().done(function () {
//客户端发送信息到服务器
myHub.server.Send($.connection.hub.id);
});
});
</script>
</head>
<body> </body>
</html>

后端MyHub类中,添加方法:

       //客户端发送信息到服务器
public void Send(string message)
{ }

访问html,就能直接调用Send方法了。

至此,前端调用后端,结束。

2)后端主动调用前端

前端代码,增加了后端调用前端JS

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8"/>
<script src="/scripts/jquery-1.10.2.min.js"></script>
<!--Reference the SignalR library. -->
<script src="/scripts/jquery.signalR-2.2.1.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src='/SignalR/hubs'></script>
<!--Add script to update the page and send messages.-->
<script type='text/javascript'>
$(function () {
//引用自动生成的代理,myHub是HubName注解属性
var myHub = $.connection.myHub; //后端调用前端
myHub.client.serverSend2Client = function (message) {
console.log("serverSend2Client message=" + message);
}; //开始连接
$.connection.hub.start().done(function () {
//客户端发送信息到服务器
myHub.server.send($.connection.hub.id);
console.log("connection.hub.id=" + $.connection.hub.id);
});
});
</script>
</head>
<body> </body>
</html>

后端代码:

我们新建一个Notifier的静态类,好处是让其他类可以灵活地调用,你也可以把方法写在Hub类中

serverSend2Client方法是与前端绑定的JS方法,可以看到前端也有此方法。

    public static class Notifier
{
private static readonly IHubContext Context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); public static void ServerSend2ClientMethod(string connectionId, string message)
{
//注册后端与前端的方法serverSend2Client。connectionId是判断发送给哪个前端
Context.Clients.Client(connectionId).serverSend2Client(message);
} }

我们在Controller中,添加代码,达到,后端主动调用前端的目的。

注意,connectionId在后端与前端后可以获取。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SignalRDemo.SignalR; namespace SignalRDemo.Controllers
{
public class DefaultController : Controller
{
// GET: Default
public ActionResult Index()
{
//接收connId,connId是前端与后端连通的唯一标识
string connId = Request["connId"] ?? "";
//调用 后端主动调用前端的方法
Notifier.ServerSend2ClientMethod(connId, Math.Round(1000.0) + ""); return View();
}
}
}

至此,后端主动调用前端代码结束。

代码下载地址GitHub  https://github.com/cjt321/SignalRDemo

如果你的部署是负载均衡,多台服务器,可以查看Redis与SignalR的配置。C# BS消息推送 负载均衡-SignalR&Redis的配置(三)

可以关注本人的公众号,多年经验的原创文章共享给大家。

C# BS消息推送 SignalR Hubs环境搭建与开发(二)的更多相关文章

  1. C# BS消息推送 SignalR介绍(一)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...

  2. 消息推送SignalR简单实例

    消息推送SignalR:一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信. 功能:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请 ...

  3. iOS 10 消息推送(UserNotifications)秘籍总结(二)

    背景 上一篇博客iOS 10 消息推送(UserNotifications)秘籍总结(一)发布后被 简书编辑推荐至首页,这着实让我受宠若惊啊.可是好事不长,后面发生了让我伤心欲绝的事,我的女朋友不要我 ...

  4. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  5. 用 centrifugo 搭建 消息推送服务器 docker + rancher 搭建

    关于消息推送服务器 目前有很多第三方的开放成熟的推送服务.鉴于项目需要 我们项目需要自己搭建 自己的推送服务. 我们的推送应用场景 聊天消息 项目内部消息提醒 移动设备接受消息 应用到的相关软件工具知 ...

  6. 消息推送SignalR

    一.什么是 SignalR ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of add ...

  7. C# BS消息推送 负载均衡-SignalR&Redis的配置(三)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 2. 负载均衡配置 配置很简单,只要在startup类中添加Redis的连接就OK. 1)首先,引 ...

  8. 细说 iOS 消息推送

    APNS的推送机制 与Android上我们自己实现的推送服务不一样,Apple对设备的控制很严格.消息推送的流程必需要经过APNs: 这里 Provider 是指某个应用的Developer,当然假设 ...

  9. MPush开源消息推送系统:简洁、安全、支持集群

    引言由于之前自己团队需要一个消息推送系统来替换JPUSH,一直找了很久基本没有真正可用的开源系统所有就直接造了个轮子,造轮子的时候就奔着开源做打算的,只是后来创业项目失败一直没时间整理这一套代码,最近 ...

随机推荐

  1. View动画和属性动画

    在应用中, 动画效果提升用户体验, 主要分为View动画和属性动画. View动画变换场景图片效果, 效果包括平移(translate), 缩放(scale), 旋转(rotate), 透明(alph ...

  2. memcache的lru删除机制

    惰性删除,get时才删除 LRU原理:当某个单元被请求的时候,维护一个计数器,通过计数器来判断最近谁最少使用,那就把谁踢出去. 注:即使某个key设置的永久有效,也会被踢出来,这个就是永久数据被踢的现 ...

  3. getSlotFromBufferLocked: unknown buffer: 0xf3d94ca0

    安卓6.0模拟器导致,换一个模拟器解决

  4. 【转载】给那些想多学习,多进步的Domino初学者

    在这个社区里面,包括QQ技术群里面混了很久了.遇到了很多Domino初学者,也认识了很多致力于Domino这个技术领域的朋友,很开心.很久没有写长篇大论给大家了.我要把一些想法写出来,共大家参考.讨论 ...

  5. 【爬虫】Python2 爬虫初学笔记

    爬虫,个人理解就是:利用模拟“操作浏览器”的过程,自动获取我们想要的数据(或者说信息,比如图片啊) 为何要学爬虫:爬取数据,为我所用(相当于可以把一类数据整合起来) 一.简单静态网页爬虫架构: 1.B ...

  6. some useful linux commands

    # best way to see log file less +F /var/log/syslog (equals: less /var/log/syslog, then shift+f) # se ...

  7. mac homebrew的用法

    与 MacPorts 类似,OS X 下还有款包管理工具为 Homebrew,安装方法也很简单. ruby -e "$(curl -fsSL https://raw.github.com/H ...

  8. Jstack Jmap jstat

    jstack jmap jstat 代码,这里以这个为例怎样使用jstack诊断Java应用程序故障 public class DeadLock { public static void main(S ...

  9. c++单例模式为什么不在析构函数中释放静态的单例对象(转)

    需要清楚一下几点:   1.单例中的 new 的对象需要delete释放.   2.delete释放对象的时候才会调用对象的析构函数.   3.如果在析构函数里调用delete,那么程序结束时,根本进 ...

  10. PHP通过加锁实现并发情况下抢码实现

    需求:抢码功能 要求: 1.特定时间段才开放抢码: 2.每个时间段放开的码是有限的: 3.每个码不允许重复: 实现: 1.在不考虑并发的情况下实现: function get_code($len){ ...