前言

  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 { getset; }
        //
        // 摘要:
        //     Gets or sets the hub caller context.
        public HubCallerContext Context { getset; }
        //
        // 摘要:
        //     Gets or sets the group manager.
        public IGroupManager Groups { getset; }
        //
        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 SingalR,LayIM2.0实现的web聊天室

  • ASP.NET 2.2 Preview 1首次支持Java SignalR客户端

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

  • ASP.NET Core的实时库: SignalR简介

  • ASP.NET Core的实时库: SignalR -- 预备知识

  • 横向扩展你的ASP.NET Core SignalR 应用

  • 微信小程序与AspNetCore SignalR聊天实例

  • Asp.Net Core SignalR 与微信小程序交互笔记

  • ASP.NET Core 2.1带来SignalR、Razor类库

  • 发现 ASP.NET Core SignalR

  • SignalR Core尝鲜

原文地址: https://www.cnblogs.com/panzi/p/9649315.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.Net Core SignalR 初体验相关推荐

  1. Consul在.Net Core中初体验

    Consul在.Net Core中初体验 原文:Consul在.Net Core中初体验 简介 在阅读本文前我想您应该对微服务架构有一个基本的或者模糊的了解 Consul是一个服务管理软件,它其实有很 ...

  2. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

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

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

  4. Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

    Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...

  5. Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验

    Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...

  6. .NET WebSocket 核心原理初体验

    上个月我写了<.NET gRPC核心功能初体验>, 里面使用gRPC双向流做了一个打乒乓球的Demo, [实时][双向]这两个标签是不是很熟悉,对, WebSockets也可以做实时双向通 ...

  7. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  8. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)

    2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...

  9. Swift与C++混编 OpenCV初体验 图片打码~

    OpenCV初体验,给图片打码 提到OpenCV,相信大多数人都听说过,应用领域非常广泛,使用C++开发,天生具有跨平台的优势,我们学习一次,就可以在各个平台使用,这个还是很具有诱惑力的. 本文主要记 ...

最新文章

  1. mac 怎么查找大于200m的文件_U盘无法拷贝大于4GB的文件怎么办?
  2. Sublime Text2 常用快捷键
  3. IDEA----破解
  4. DOSbox汇编环境配置
  5. 推荐系统笔记(关键模块)
  6. html+css+javascript 网页设计 从入门到精通_绵阳美工设计学习
  7. c语言链表贪吃蛇教程,编《贪吃蛇》最简单的算法,链表法
  8. 漫步数理统计五——条件概率与独立(上)
  9. 基于Docker快速搭建ELK
  10. python乒乓球比赛规则介绍_乒乓球的比赛规则介绍
  11. CVPR 2021 TrafficQA
  12. 基于氚云平台的应用开发学习(一)
  13. java mail 匿名_java开发邮件发送匿名
  14. 一个字形容大数据_中国大学校训大数据:最短的2个字,最长的28个字,10大高频汉字...
  15. winform chart 网格线设置
  16. 多线程与单线程的区别
  17. 玩客云当打印机服务器,再玩一次机,我把玩客云改造成了群控系统!
  18. 基于神经网络的预测控制,神经网络预测系统应用
  19. 云计算机渲染效果,为什么有的人要用云渲染?云渲染怎么用?
  20. 撸羊毛当当图书618优惠码,花120买300(含书单推荐)

热门文章

  1. Javascript中的循环变量声明,到底应该放在哪儿?
  2. 时隔两年 重新当码农
  3. 系统架构师-基础到企业应用架构-服务层
  4. Lucifer的一场暴强围英雄表演
  5. 防止多次提交的几个比较
  6. 发布nuget包的正确姿势---cicd自动打包发布
  7. ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本
  8. 关于 .NET 与 JAVA 在 JIT 编译上的一些差异
  9. 使用 .NET Core 中的 EventCounters 衡量性能
  10. ASP.NET Core托管运行Quartz.NET作业调度详解