继续学习

最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不说微软现在真的强大,很多事情都帮你考虑到了,比如使用Redis,使用Redis后,你的websocket就支持横向扩展了,使用的方式也特别简单,只需要在services.AddSignalR的后面再加上:

.AddRedis(options =>
{options.Configuration.ConnectTimeout = 30;options.Configuration.EndPoints.Add("redis ip");
})

SignalR Core利用了Redis的发布订阅功能,就实现了横向扩展,再也不用担心一台ws服务器不够用了.

今天要说的并不是SignalR Core的负载均衡方式,而是如何优雅的调用前端方法。大家都知道SignalR Core除了可以建立websocket连接,还能双向调用,服务器调用客户端方法,客户端也能调用服务器的方法。

原始调用

我们看下如何调用客户端方法:

public class ChatHub : Hub{    //服务端方法public async Task SendMessage(string user, string message)    {        //ReceiveMessage 为客户端方法,让所有客户端调用这个方法await Clients.All.SendAsync("sayHello", user, message);}
}

还是ChatHub~~~~~

我们可以看到在这里我们调用了客户端的sayHello,并传递了两个字符串参数user,message,是不是觉得丑陋,说实在的真心看不下去哈。而且不变维护,相当于你要把方法名硬编码,传递多少个参数也没有个准,没有好的文档后期很难维护。好在微软已经为我们考虑到了这个情况,我们可以把客户端的方法用接口的方法定义了!!!对!没错,用接口的方式定义客户端的方法!!

优雅调用

使用的方式也超级简单,我们先定义一个客户端的接口:

public interface IMyClient{        Task SayHello(string user, string message);
}

然后我们的Hub集成Hub,T就是你定义的客户端接口,这里也就是IMyClient,我用上面的ChatHub举例:

public class SendMessageHub : Hub<IMyClient>
{    public async Task SendMessage(string user, string message){await this.Clients.All.SayHello(user, "from server:" + message);        //ReceiveMessage 为客户端方法,让所有客户端调用这个方法//await Clients.All.SendAsync("sayHello", user, message);}
}

注释掉的是我之前的方式,SayHello是客户端的方法,会通过websocket传递到前端,下图为我用小程序通讯产生的结果:

是不是SoEasy??我觉得还不算完,我们参数目前是按照数组的方式传递的,如果有限定的参数名就完美了,我们改造下IMyClient:

public interface IMyClient{   

 Task SayHello(HelloMessage message);
}

 public class HelloMessage{     public string User { get; set; }  

   public string Message { get; set; }
}

修改下我们的Hub的SendMessage方法:

public  Task SendMessage(string user, string message)
{    return this.Clients.All.SayHello(new HelloMessage(){User = user,        Message = "from server:" + message});//return this.Clients.All.SendAsync("sayHello", $"from server:{message}");
}

在运行下我们的小程序:

LooK,方法名没有改变,但是我们返回的参数成了一个对象,如果看过我之前那篇博文的话,应该记得在前端的时候,我需要做一个映射,来调用前端的方法,在映射中,我参数使用的是数组进行传递的,现在不需要去看数组中第几个参数是我需要使用的了,你完全可以使用:

callMethods(methods, args) {      console.log(methods, args);       let self = this;       let arg = args[0];        switch (methods) {            case 'SayHello':self.sayHello(arg.message);                  break;}
},

这里还有个问题,就是接口中的方法名是大写开头的,而js的规范呢一般都是小写开头的,所以在映射方法的时候需要注意下,反正这个大小写问题有点不是很爽,参数在传递的时候倒是直接转换成首字母小写,我相信SignalR Core是可以实现的,只是我不知道而已,稍后在研究研究,如果可行,我会更新此篇博文。如果你要在接口中用小写来定义这个方法,也没有问题,但我觉得就是不符合规范,习惯不允许我如此粗糙,哈哈。

写在最后

至于调用的原理,我没有细看,正好在看源码的时候,看到了Hub,很疑惑,尝试了下后才发觉SignalR的牛逼,后来发现其实在SignalR 2.1中引用了这个概念,估计很多人已经在用了,但好像提到的人很少,包括微软的文档,这次也是意外发现,赶快记录下来,希望对您有用。

Asp.Net Core SignalR确实很强大,有兴趣的可以去gayhub上去研究下他们的源码。

原文地址:https://www.cnblogs.com/inday/p/signalR-core-grace-call-client-methods.html

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

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

  1. ASP.NET Core SignalR:集线器Hub

    一.什么是集线器hubs 通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法.SignalR负责实现了客户端和服务器之 ...

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

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

  3. [asp.net core]SignalR一个例子

    摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...

  4. 基于ASP.NET Core SignalR的流式传输

    基于ASP.NET Core SignalR的流式传输 SignalR概述 SignalR是ASP.NET Core下非常流行的实现Web实时功能的库.微软再文档中列出了适合的应用场景: 适合 Sig ...

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

    什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...

  6. 发现 ASP.NET Core SignalR

    ASP.NET SignalR 是几年前推出的工具,可供 ASP.NET 开发人员使用,以向应用程序添加实时功能.只要基于 ASP.NET 的应用程序必须接收来自服务器(从监视系统到游戏)的频繁异步更 ...

  7. GitHub高赞!ASP.NET Core SignalR聊天室开源了!

    能双向通信的SignalR框架,很多人都感兴趣却又玩不转,最近发现一个基于.NET6的ASP.NET Core SignalR聊天室,完成了基于SqlSugar+SQLServer登陆退出和聊天存档等 ...

  8. 在Typescript中使用ASP.NET Core SignalR和React创建实时应用程序

    目录 介绍 ScrumPoker应用程序 源代码 开发工具 基本步骤 后端代码 创建Hub 在Startup中注册集线器 创建持久性 让我们为客户端应用程序公开一些终端 启用Cors 前端代码 结论 ...

  9. Asp.Net Core SignalR获取集线器实例,从集线器外部发送消息

    一.从控制器中获取IHubContext 操作发送消息 此种方式,常用简单 public class HomeController : Controller {private readonly IHu ...

最新文章

  1. BZOJ2653 middle 【主席树】【二分】*
  2. 开课吧python小课值得么-领导想提拔你,从来看的不止努力!
  3. 【转】usermod 添加用户多个附属组
  4. 8-1日复习 模板函数 模板类
  5. Swift3.0温习之基础篇
  6. 文件以附件形式下载的方法
  7. 美女晕倒怎么办?二哈:这不是一滋就醒......
  8. Web Hacking 101 翻译完成
  9. 分治法求最大和最小值
  10. linux 终端 qmake,qt中的qmake命令设置
  11. python开根号函数图像_使用matplotlib / python的平方根刻度
  12. python简述题_常见Python面试题-附答案
  13. 三朵云 华为_【创业前沿】华为突然传来大消息!对不起,我要辞职了!
  14. ARP网关欺骗程序的实现(vs2008 winpacp)
  15. 参考文献的序号如何设置
  16. CSS选择符(选择器)基础认识
  17. python检测刀具_科研一角|Python语言在人工智能加工中心机器人方面的应用
  18. Roaring Bitmap 原理及实践
  19. 实验二十三——RPL协议仿真实验
  20. KendoUI系列:switch 开关

热门文章

  1. AWD-LSTM为什么这么棒?
  2. SSIS package 更新 variable
  3. 判断三点是顺时针还是逆时针方向
  4. SignalR的使用
  5. 记一次 .NET 某WMS仓储打单系统 内存暴涨分析
  6. NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?
  7. C#通过工厂模式,我把一大堆if干掉了
  8. 后宫佳丽三千,假如古代皇帝也懂负载均衡算法...
  9. docker安装jenkins并用docker部署net
  10. 如何使用 C# 中的 Tuple