前言

  Asp.Net SignalR已经出来很久了,但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档,如何搭建一个SignalR的Demo。

  参考文章:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-2.1&tabs=visual-studio

  SignalR地址:https://github.com/aspnet/SignalR

  所以为了快速搭建和体验.Net Core版本的SignalR,我选择了下载官方的Demo和参考官方给的教程。所以具体的搭建过程我就不再本文中写了。

体验效果

  官网给出的DEMO运行如下图:

  

  点击connect,查看一下network。可以发现,它在当前浏览器支持三种方式。

  

  而且和.NET Framework版本不同的是,新版SignalR中的Hub类型也是蛮丰富的。Demo中给出了 普通Hub,DynamicHub,Hub<T> 三种类型。我们去看看其中的区别吧。

  普通Hub

  查看定义,可以看到普通Hub中的Clients类型是 IHubCallerClients 

namespace Microsoft.AspNetCore.SignalR
{
//
// 摘要:
// A base class for a SignalR hub.
public abstract class Hub : IDisposable
{
protected Hub(); //
// 摘要:
// Gets or sets an object that can be used to invoke methods on the clients connected
// to this hub.
public IHubCallerClients Clients { get; set; }
//
// 摘要:
// Gets or sets the hub caller context.
public HubCallerContext Context { get; set; }
//
// 摘要:
// Gets or sets the group manager.
public IGroupManager Groups { get; set; } //
public void Dispose();
//
// 摘要:
// Called when a new connection is established with the hub.
//
// 返回结果:
// A System.Threading.Tasks.Task that represents the asynchronous connect.
public virtual Task OnConnectedAsync();
//
// 摘要:
// Called when a connection with the hub is terminated.
//
// 返回结果:
// A System.Threading.Tasks.Task that represents the asynchronous disconnect.
public virtual Task OnDisconnectedAsync(Exception exception);
//
// 摘要:
// Releases all resources currently used by this Microsoft.AspNetCore.SignalR.Hub
// instance.
//
// 参数:
// disposing:
// true if this method is being invoked by the Microsoft.AspNetCore.SignalR.Hub.Dispose
// method, otherwise false.
protected virtual void Dispose(bool disposing);
}
}

  IHubCallerClients 定义如下:

  public interface IHubCallerClients : IHubCallerClients<IClientProxy>, IHubClients<IClientProxy>
{
}

  而框架又给IClientProxy增加了扩展方法:SendAsync

  所以在普通Hub中,定义客户端方法的时候,需要把方法名当作参数传入SendAsync方法中。例如如下代码:

 public Task Send(string message)
{
return Clients.All.SendAsync("Receive", $"{Context.ConnectionId}: {message}");
}

  DynamicHub

  DynamicHub我是比较喜欢的,因为他和 Framework版的是一样(或者说看起来是一样的)的。动态Hub我们就可以不必拘泥于只能调用SendAsync方法了。例如:

  public Task SendToOthers(string message)
{
return Clients.Others.ThisIsMyReceiveMethod($"{Context.ConnectionId}: {message}");
}

  DynamicHub的Clients类型为:DynamicHubClients ,它的内部变量全都是dynamic类型的。

  

  Hub<T>

  泛型Hub就把规约交给开发者制定。在Demo中 Hub<IChatClient> 中的IChatClient接口定义了Receive方法,因此Clients中的对象可以调用Receive方法。同理,我们可以根据业务需要定义自己的方法。至少从代码上看会显得更加通俗易懂一些。比如:

 public interface IChatClient
{
Task Receive(string message);
Task LoginSuccess(long userId);
}
     public Task Login(long userId)
{
return Clients.Caller.LoginSuccess(userId);
}

  其实从代码上来看的话,他们都是Hub,只不过是不同的扩展实现而已。而泛型Hub不过是用户自定义泛型接口,而默认Hub中的默认泛型接口为:IClientProxy.所以看到这里,如果我就想使用原生的Hub而又想自定义方法怎么办呢?很简单,加扩展就可以了。

  为什么自己加就可以呢,其实 SendAsync 就是扩展方法,它内部也是调用了SendCoreAsync方法。于是乎,写下自己的扩展方法,那这样子就很灵活了。我们把method参数去掉,直接写死试试:

  public static Task LoginAsync(this IClientProxy clientProxy, string message, CancellationToken cancellationToken = default(CancellationToken))
{
return clientProxy.SendCoreAsync("LoginSuccess", new object[] { message}, cancellationToken);
}

  其实说白了,这个扩展方法还是需要传入method参数的,只不过封装了一层(似乎感觉这么做有意义吗?哈哈,还是老老实实用泛型吧),那么我们在去看Hub中的方法,修改Send方法如下:

  public Task Send(string message)
{
return Clients.All.LoginAsync($"{Context.ConnectionId}: {message}");
}

  是不是这样子就实现了自己自定义方法了呢?个人觉得这么写还绕了一圈,不如用泛型或者Dynamic了。

  运行一下,看看效果:

  

  其实我也是抱着试试的态度,没想到还真是这样,和新方法就是SendCoreAsync,而其他方法只不过是上层封装使得代码更加通俗易懂。

使用Redis

  Demo中的其他例子就不再演示了。广播,一对一,一对多,加入组,退出组等基本和之前一样。这里在演示一下使用Redis做不同实例之间的通信效果。

  首先程序集是不能少的:Microsoft.AspNetCore.SignalR.Redis,然后在Startup中补充代码:

  

  打开Redis客户端,使用MONITOR命令监听一下,从程序启动,到连接,在发送一条广播消息:hello redis。  redis 监听结果如下:

  

  所以,PUB/SUB还是立了大功呢。

  这里用CMD运行了两个实例,端口分别为 8881,8882来模拟两个站点。

  

  演示效果如下:

  没问题的哦,其实仔细想想,虽然运行了两个网站实例,但是连接信息都保存在同一个Redis上,那肯定通信是木的问题的啦。

总结

  只是简单的运行了一下DEMO,大致了解了一下 .Net Core SignalR的表层,至少跑Demo是跑起来了,并且使用Redis也是没有问题的。不过好像会出现运行一旦时间,程序自动停掉的问题,不知道是不是我电脑的问题。。今天就到这里吧,希望大家能有所收获。 本文代码地址:https://github.com/fanpan26/LayIM.AspNetCore/tree/master/src/LayIM.AspNetCore.Demo/SignalRSamples

 

.Net Core SignalR 初体验的更多相关文章

  1. SignalR初体验

    简介 ASP .NET SignalR[1]  是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以 ...

  2. Consul在.Net Core中初体验

    Consul在.Net Core中初体验 简介 在阅读本文前我想您应该对微服务架构有一个基本的或者模糊的了解 Consul是一个服务管理软件,它其实有很多组件,包括服务发现配置共享键值对存储等 本文主 ...

  3. SignalR 初体验

    目录 一.前言 二.服务端 2.1.站点服务端 2.2.宿主服务或客户端 2.3.持久连接和集线器 三.客户端 3.1.使用代理客户端 3.2.不使用代理客户端 一.前言 微软官方给的说明:ASP.N ...

  4. asp net core 跨平台初体验

    标: 在 ubuntu 16.04 上部署一个 asp.net core 站点,打开网站后显示一段文字.   安装 net core 运行环境:ubuntu 16.04 LTS 1.添加 apt 源 ...

  5. vscode 创建.net core项目初体验

    微软的virtual studio编辑器那是宇宙第一大编辑器,可惜就是太笨重,遇到性能差一些的电脑设备,简直无法快速的编辑项目. 而vs code编辑器轻便易用,想要编辑哪种项目,只需扩展插件就OK, ...

  6. .Net Core Serverless初体验

    什么是Serverless Serverless 是一个当今软件世界中比较新的话题.它并没有一个普遍公认的权威定义,每个人每个企业对它的解释可能都有不同,而 Serverless 正是在这种情况下不断 ...

  7. LayIM.AspNetCore Middleware 开发日记(七)Asp.Net.Core.SignalR闪亮登场

    前言   前几篇介绍了整个中间件的构成,路由,基本配置等等.基本上没有涉及到通讯部分.不过已经实现了融云的通讯功能,由于是第三方的就不在单独去写.正好.NET Core SignalR已经出来好久了, ...

  8. .NET Core SignalR 和 .NET SignalR 区别

    由于要转 .NET Core ,对于以前用到的一些进行迁移. 在迁移 SignalR 的时候发现 .NET Core 下的和 .NET 下的区别还是挺大的. 功能差异 自定重新连接 .NET 下的 S ...

  9. ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...

随机推荐

  1. Autofac +webapi 配置

    Autofac配置 using Autofac; using System; using System.Collections.Generic; using System.Linq; using Sy ...

  2. 如何高效的算出2x8的值

    原文出自:https://blog.csdn.net/seesun2012 位移算法,如何高效的算出2*8的值,为什么8<<1,4<<2,2<<3,1<< ...

  3. 让div铺满整个空间

    需要用到几个css属性: .content{ width:100%;position: absolute;top: 50px;bottom: 0px;left: } 设置了bottom.top及abs ...

  4. Nuxt.js学习心得

    一.官网 Nuxt.js - Universal Vue.js Applications https://nuxtjs.org/ 二.中文官网 Nuxt.js - Vue.js 通用应用框架 http ...

  5. LDAP概念了解

    LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.LDAP支持TCP/IP,这对访问Internet是必须的. L ...

  6. 任意表格(table)实现拖动列(column)改变列大小

    直接上代码吧,原理可以看我上一篇博文.本实现基于jquery,完美实现拖动改变表格的列大小功能,只需将代码放置在你页面的底部即可(jquery必须先引入). $(function () { var i ...

  7. Windows Server 2008 R2 搭建网站详细教程

    转自:http://jingyan.baidu.com/album/642c9d34098bf5644a46f71f.html?picindex=4 网上都有一些Windows Server 2008 ...

  8. JavaEE之会话技术Cookie&Session

    会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪         里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并 ...

  9. ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误

    ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误 1.测试环境说明 ArcSDE版本:10.2.2 Oracle版本:12.1.0.1和11. ...

  10. 【阿里云产品公测】云引擎ACE公测感受

    听说阿里云ACE开始公测了,怀着激动的心情赶紧试用了一下. 这是我用ACE做出来的效果:http://haoyuming.aliapp.com/ 大家点点看看啊 A*W/Q<~I   :eSwX ...