前言

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

所以,我认为,如果一个程序员,在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. 三级菜单python写法(递归写法)

    数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, ...

  2. 从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”(转)

    C++的内存有五大分区:堆区.栈区.自由存储区.全局/静态存储区.常量存储区. 五个数据段:数据段.代码段.BSS段.堆.栈 内存分配方式有三种: 从静态存储区域分配.内存在程序编译的时候就已经分配好 ...

  3. IDEA设置生成带注释的getter和setter解决方案 (图文教程)

    近日在研究重构代码的时候有用到idea的不少插件,比如CheckStyle,同时下载了阿里的开发规约,收到不少启发. 规约中会要求所有的方法都有Javadoc,但是通常我们用idea默认生成的gett ...

  4. apache2.4 虚拟主机配置

    网上教程很多,仅记录我的配置,可供参考 一.修改httpd.conf 打开appserv的安装目录,找到httpd.conf文件,分别去掉下面两行文字前面的#号. #LoadModule vhost_ ...

  5. 【转】mysql 中int类型字段unsigned和signed的区别

    转自https://www.cnblogs.com/wangzhongqiu/p/6424827.html 用法: mysql> CREATE TABLE t ( a INT UNSIGNED, ...

  6. Jmeter性能测试 如何利用SQLserver造出大批的数据

    作为一个测试人员,需要做性能测试时候,如果没有实际数据,或者实际数据不适合做压测,就要自己着手造数据了. 以下面的接口测试为例,简单介绍下需要的数据: 这是一个会员注册接口,入参比较多,你可以选用全部 ...

  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 prototype详解

    用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...

  9. Postman用法简介

    转自:http://blog.csdn.net/flowerspring/article/details/52774399 Postman用法简介 转载 2016年10月10日 09:04:10 10 ...

  10. Intellij Idea中如何debug本地maven项目

    方法一:使用maven中的jetty插件调试本地maven项目 1.打断点 2.右击"jetty:run",选择Debug运行 3.浏览器发送http请求,开始调试 方法二:利用远 ...