C# -Asp.Net.SignalR.Core之Hub
前言
程序员的进步是需要环境的,良好的团队环境,良好的开发环境,会让人进步的更加快速。
所以,我认为,如果一个程序员,在2019年还在用Visual Studio 2005开发,那么,他,大概率,不会想了解Linq是个什么东西,因为他根本用不到。
就如同我,一直在纯Windows环境下开发,所以就对Core并不是很感兴趣。
因此,如果一直用Visual Studio 2013以下版本开发的话,估计他对SignalR也就没什么兴趣。
因为我们都有个坏习惯,用不到的就不喜欢去学习。
引用SignalR
闲话少叙,现在我们开始学习SignalR。
首先,创建一个MVC项目,然后,我们打开Nuget搜索SignalR,如下图:

成功引用后,我们查看引用,会发现程序引用了很多dll,比如Owin等等;这是因为SingalR的依赖项比较多,所以,我们也引用了比较多的DLL。
接着,我们会发现一个问题,我们添加引用是SignalR,但实际引用进来的却是SignalR.Core,如下图:

SignalR.Core和SignalR有什么区别呢?
我们上网查询一下,发现,他们的差异大致上就是下面这句话。
【ASP.NET Core SignalR 不支持自动重新连接。 如果客户端已断开连接,则用户必须显式启动新连接才能重新连接。 在 ASP.NET SignalR 中,如果连接断开,SignalR 会尝试重新连接到服务器。】
差异参考ASP.NET SignalR 和 ASP.NET Core SignalR 之间的差异
Startup
SignalR引入完成了,现在我们需要配置和使用它了。
如何配置呢?很简单。添加Startup文件,修改代码如下:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
Startup文件包含的功能很多,这里暂时不去详解了,我们暂时只要知道,Startup文件会在网站启动时跟着一起运行就可以了。
因为网站运行时会调用Startup的Configuration方法,所以,我们在这里打开SignalR的映射——app.MapSignalR(),即网站初始化,我们就开启了SignalR的映射。
Hub
SignalR简单的来说,是用于一个网页即时通讯的工具,既然是即时通讯,那么肯定就是双工——双向的。
现在我们先来看下,【网页——>服务器】这个方向的通讯。
网页向服务器发送信息
首先,我们在服务器建立一个Hub,用来接收网页的消息。
//这里命名尽量用小写,因为前台只认小写
[HubName("kibahub")]
public class kibahub : Hub
{
// 这里函数命名虽然是大写,但前台Js调用要用小写字母开头
public void Send(string message)
{
var id = Context.ConnectionId;
}
}
代码很简单,我们建立了一个类,并集成Hub,然后编写了一个Send方法,供页面调用。
还可以看到,我们在类上面加了一个特性,用来显示的声明这个Hub在网页端的名称。
接下来,我们编写网页代码,在网页中,使用JavaScript来调用这个Hub的Send方法,代码如下:
<head>
<script src="~/Scripts/jquery-3.3.1.min.js"></script>@*优先signalR引用*@
<script src="~/Scripts/jquery.signalR-2.4.0.js"></script>
<script src="~/Signalr/hubs"></script>@*这个是临时生成的文件,里面保存的是我们在服务器定义的hub生成的JavaScript代码*@
</head>
<body>
<script type='text/javascript'>
//引用自动生成的代理,kibahub是HubName注解属性
var kibaHub = $.connection.kibahub;
console.log("kibaHub get");
//开始连接
$.connection.hub.start().done(function () {
console.log("hub start done");
//客户端发送信息到服务器
kibaHub.server.send('kiba');
console.log("Send done");
});
</script> </body>
</html>
从代码中可以看到,我们首先引用了三个js文件。
第一个没啥可说的,就是jq的文件。
第二jquery.signalR-2.4.0.js文件,是我们在引用SignalR时,一起引入进来的,在Scripts文件夹下,我们也直接引入即可。
第三Signalr/hubs个文件大家应该很奇怪,我们项目里根本没有这个文件夹,也没有这个文件,而且这个hubs文件居然还没有后缀名。
事实上这个文件夹和文件的确是不存在的,因为,它们是在我们运行网站时,才会生成的临时文件。目前先不去管他是什么,我们只要知道,需要这个引用就可以了。
接下来,我们看下JavaScript代码。
在js代码里,我们通过$.connection.kibahub这样一句话就获取到了服务器的kibahub类的实例了,然后,我们只要调用它的Send方法就可以了。
但是在调用之前,我们需要先连接一下服务器。所以就有了这么一句话 $.connection.hub.start()。
到此,网页向服务器发送数据已经编写完成了,下面我们运行网站,在浏览器中按下F12进入调试模式,然后选择Console(控制台)来查看我们的输出内容。

如上图所示,我们的SignalR成功的向服务器发出了信息。
服务器向网页发送信息
网页请求已经发送成功了,现在我们开始编写服务器向网页发送信息。
首先,我们在kibahub类的Send方法里稍作修改,代码如下。
public void Send(string message)
{
var id = Context.ConnectionId;
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<kibahub>();
context.Clients.Client(id).getmessage("518");
}
可以看到,我们在Send方法中获取了当前连接的唯一标识ConnectionId,然后我们利用这个ConnectionId找到他对应的Client客户端。
在通过Client客户端调用网页中JavaScript定义的函数getmessage,并向他发送信息518。
这样服务端的代码就编写完成了。
但我们会发现,我们好像并没有在网页端用JavaScript定义过函数getmessage呀。
别着急,我们现在就去网页定义这个方法。
<script type='text/javascript'>
var kibaHub = $.connection.kibahub;
$.connection.hub.start().done(function () {
console.log("hub start done");
kibaHub.server.send('kiba');
console.log("Send done");
});
kibaHub.client.getmessage = function (message) {
console.log("getmessage:" + message);
};
</script>
如上述代码所示。我们可以看到getmessage 已经定义好了,现在我们在运行下网站。

如上图所示,服务成功的向客户端发出了信息。
----------------------------------------------------------------------------------------------------
到此Asp.Net.SignalR.Core就介绍完了。
框架代码已经传到Github上了,欢迎大家下载。
Github地址:https://github.com/kiba518/KibaSignalR
----------------------------------------------------------------------------------------------------
注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

C# -Asp.Net.SignalR.Core之Hub的更多相关文章
- Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参
继续学习 最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式
连表查询都用Left Join吧 最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言
前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(二) 之 ChatServer搭建,连接服务器,以及注意事项。
上篇:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取) 上一篇我们已经完成了初步界面的搭建工作,本篇将介绍IM的核心内容 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言(内容已过期,阅读请慎重)
2018-09-19 更新 :现在已经更新ASP.NET Core Middleware版本.对.NET Core SignalR感兴趣的朋友移步:https://github.com/fanpan2 ...
- Microsoft ASP.NET SignalR
SignalR类似与JavaScript实时框架,如Socket.IO.SignalR能够完成客户端向服务器的异步通信,并同时支持服务器向浏览器客户端推送事件.SignalR的连接通过日益流行的Web ...
- ASP.NET SignalR入门
前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...
随机推荐
- 理解Python中的类对象、实例对象、属性、方法
class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...
- 获取linux帮助命令
命令的分类 linux的命令分为内部命令和外部命令. 内部命令指的是shell程序自带的命令,是shell程序的一部分,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系 ...
- 记一次webpack打包优化
未进行打包优化的痛点: 随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发. 解决思路: 第三方库我们只是引入到项目里来,一般不 ...
- 洛谷 P1462 解题报告
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- 洛谷 P1691 解题报告
P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...
- SpringMVC中日期格式的转换
解决日期提交转换异常的问题 由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑定.前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestM ...
- JAVA远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成&qu ...
- RCTF 2018线上赛 writeup
苦逼的RCTF,只进行了两天,刚好第二天是5.20,出去xxx了,没法打比赛,难受.比赛结束了,还不准继续提交flag进行正确校验了,更难受. 下面是本次ctf解题思路流程 后面我解出的题会陆续更新上 ...
- 巩固java(七)-----java反射机制
一般而言,开发者社群说到动态语言,大致认同的一个定义是:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言, ...
- [Python]range与xrange用法对比
[整理内容]具体如下: 先来看如下示例:>>>x=xrange(0,8)>>> print xxrange(8)>>>print x[0]0> ...