前言

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

所以,我认为,如果一个程序员,在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

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

转载于:https://www.cnblogs.com/kiba/p/10641531.html

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 Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...

  3. Asp.Net SignalR Hub集线器

    原文:Asp.Net SignalR Hub集线器 集线器Hub类 使用持久连接类去开发是有些困难的,因为基于事件的开发方式,我们可以进行操作的地方也仅仅只是OnReceived事件内,这有些像web ...

  4. SignalR Core尝鲜

    \ 要点 \\ SignalR Core改用Microsoft.AspNetCore.Sockets,不再依赖HTTP.\\t 使用MessagePack序列化格式,支持二进制协议.\\t TypeS ...

  5. Asp.net SignalR 应用并实现群聊功能 开源代码

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

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

    参考博客https://www.cnblogs.com/wintersun/p/4148223.html ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的W ...

  7. ASP.NET SignalR增加Azure支持

    在过去几年里,微软一直在开发两种形式的SignalR--原先的ASP.NET SignalR库和新的ASP.NET Core SignalR.来自微软的Andrew Stanton-Nurse最近分享 ...

  8. [Asp.net]SignalR实现实时日志监控

    摘要 昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错.当然,网上也有很多成熟的类似的监控系统.就想着如果通过.net该如何实现?所以就在想 ...

  9. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现...

    前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题.对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传.于是我就简单做了个图标替代 ...

最新文章

  1. LeetCode算法题14:递归和回溯2
  2. 使用BootStrap制作用户登录UI
  3. python排序的两个方法
  4. 嵌入式开发过程中结构体字节对齐问题pragma pack(1)
  5. 深入理解SpringBoot(2)
  6. day42-mysql索引
  7. 测试经典用例练习之水杯测试用例
  8. java后台json集合传前台js
  9. 计算机如何打开安全组策略,Win10系统无法打开本地安全策略如何解决
  10. java文库_java实现类似百度文库功能
  11. jQuery日常记录
  12. 数据的逻辑结构包括那些?
  13. Windows10常用功能一键设置优化工具分享
  14. 在Win7上安装TexLive及设置XeLaTeX的整个过程
  15. 多人配音怎么做的?这两个多人配音方法分享给你
  16. 是谁给我充的手机费?
  17. 班得瑞轻音乐全集[下载]
  18. Android Canvas.scale缩放
  19. logit方程怎么写_呆哥数学坐标系与参数方程——最全概括【1】
  20. 这款TWS蓝牙耳机颜值与实用性到底怎么样?

热门文章

  1. 关于Java中子类调用父类方法
  2. Android 解决手机unauthorized错误
  3. 17011301(UE4的AnimDynamic)
  4. 动态生成的DOM不会触发onclick事件的原因及解决方法
  5. Myeclipse快键键
  6. ZOJ3944People Counting暴力/枚举
  7. Android闹钟程序周期循环提醒源码(AlarmManager)【转】
  8. Flutter 页面滚动吸顶详解(NestedScrollView)
  9. 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?
  10. 贷款太多怎么缓解压力?