前言

程序员的进步是需要环境的,良好的团队环境,良好的开发环境,会让人进步的更加快速。

所以,我认为,如果一个程序员,在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的更多相关文章

  1. Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参

    继续学习 最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不 ...

  2. Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

    目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...

  3. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  4. 连表查询都用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%我不知道在 ...

  5. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言

    前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...

  6. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(二) 之 ChatServer搭建,连接服务器,以及注意事项。

    上篇:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取) 上一篇我们已经完成了初步界面的搭建工作,本篇将介绍IM的核心内容 ...

  7. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言(内容已过期,阅读请慎重)

    2018-09-19 更新 :现在已经更新ASP.NET Core Middleware版本.对.NET Core SignalR感兴趣的朋友移步:https://github.com/fanpan2 ...

  8. Microsoft ASP.NET SignalR

    SignalR类似与JavaScript实时框架,如Socket.IO.SignalR能够完成客户端向服务器的异步通信,并同时支持服务器向浏览器客户端推送事件.SignalR的连接通过日益流行的Web ...

  9. ASP.NET SignalR入门

    前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...

随机推荐

  1. Java开源生鲜电商平台-财务系统模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-财务系统模块的设计与架构(源码可下载) 前言:任何一个平台也好,系统也好,挣钱养活团队这个是无可厚非的,那么对于一个生鲜B2B平台盈利模式( 查看:http://www.cn ...

  2. “史上更难就业季”暴露出啥隐情?

      如果说,2013年中国高校毕业生达到699万,被称为"史上最难就业季".那么2014年将成为去年之后的"更难就业季".据最新资料显示,2014年应届大学毕业 ...

  3. MyBatis xml配置文件详解

    http://blog.csdn.net/fenghuibian/article/details/52525671

  4. sap 内表

    内表的目的在ABAP/4中,主要使用表格.表格是R/3系统中的关键数据结构.长期使用的数据存储在关系数据库表格中.关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表.除了数据库表格,还可以 ...

  5. Linux时间子系统专题汇总

    关于Linux时间子系统有两个系列文章讲的非常好,分别是WowoTech和DroidPhone. 还有两本书分别是介绍: Linux用户空间时间子系统<Linux/UNIX系统编程手册>的 ...

  6. 微信小程序开发之formId使用(模板消息)

    基于微信小程序的模板消息:基于微信的通知渠道,我们为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验.模板推送位置:服务通知模板下发条件:用户本人在微信体系内与页面有交互 ...

  7. What is the best way to handle Invalid CSRF token found in the request when session times out in Spring security

    18.5.1 Timeouts One issue is that the expected CSRF token is stored in the HttpSession, so as soon a ...

  8. 你不知道的JavaScript--Item27 异步编程异常解决方案

    1.JavaScript异步编程的两个核心难点 异步I/O.事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络.文件访问功能,且使之在后端实现了较高的性能.然而异步风格也引来了一 ...

  9. Python将html转化为pdf

    前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...

  10. windows7 dos修改mysql root密码

    第一步:打开mysql 安装路径  选择bin文件  同时按下Shift+鼠标右键  点击"在此处打开命令" 第二步:输入mysql -u root -p 按回车键会提示输入密码 ...