Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参
继续学习
最近一直在使用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优雅的调用前端方法及传参相关推荐
- ASP.NET Core SignalR:集线器Hub
一.什么是集线器hubs 通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法.SignalR负责实现了客户端和服务器之 ...
- ASP.NET Core SignalR中的流式传输
什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...
- [asp.net core]SignalR一个例子
摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...
- 基于ASP.NET Core SignalR的流式传输
基于ASP.NET Core SignalR的流式传输 SignalR概述 SignalR是ASP.NET Core下非常流行的实现Web实时功能的库.微软再文档中列出了适合的应用场景: 适合 Sig ...
- Asp.Net Core SignalR 与微信小程序交互笔记
什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...
- 发现 ASP.NET Core SignalR
ASP.NET SignalR 是几年前推出的工具,可供 ASP.NET 开发人员使用,以向应用程序添加实时功能.只要基于 ASP.NET 的应用程序必须接收来自服务器(从监视系统到游戏)的频繁异步更 ...
- GitHub高赞!ASP.NET Core SignalR聊天室开源了!
能双向通信的SignalR框架,很多人都感兴趣却又玩不转,最近发现一个基于.NET6的ASP.NET Core SignalR聊天室,完成了基于SqlSugar+SQLServer登陆退出和聊天存档等 ...
- 在Typescript中使用ASP.NET Core SignalR和React创建实时应用程序
目录 介绍 ScrumPoker应用程序 源代码 开发工具 基本步骤 后端代码 创建Hub 在Startup中注册集线器 创建持久性 让我们为客户端应用程序公开一些终端 启用Cors 前端代码 结论 ...
- Asp.Net Core SignalR获取集线器实例,从集线器外部发送消息
一.从控制器中获取IHubContext 操作发送消息 此种方式,常用简单 public class HomeController : Controller {private readonly IHu ...
最新文章
- BZOJ2653 middle 【主席树】【二分】*
- 开课吧python小课值得么-领导想提拔你,从来看的不止努力!
- 【转】usermod 添加用户多个附属组
- 8-1日复习 模板函数 模板类
- Swift3.0温习之基础篇
- 文件以附件形式下载的方法
- 美女晕倒怎么办?二哈:这不是一滋就醒......
- Web Hacking 101 翻译完成
- 分治法求最大和最小值
- linux 终端 qmake,qt中的qmake命令设置
- python开根号函数图像_使用matplotlib / python的平方根刻度
- python简述题_常见Python面试题-附答案
- 三朵云 华为_【创业前沿】华为突然传来大消息!对不起,我要辞职了!
- ARP网关欺骗程序的实现(vs2008 winpacp)
- 参考文献的序号如何设置
- CSS选择符(选择器)基础认识
- python检测刀具_科研一角|Python语言在人工智能加工中心机器人方面的应用
- Roaring Bitmap 原理及实践
- 实验二十三——RPL协议仿真实验
- KendoUI系列:switch 开关
热门文章
- AWD-LSTM为什么这么棒?
- SSIS package 更新 variable
- 判断三点是顺时针还是逆时针方向
- SignalR的使用
- 记一次 .NET 某WMS仓储打单系统 内存暴涨分析
- NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?
- C#通过工厂模式,我把一大堆if干掉了
- 后宫佳丽三千,假如古代皇帝也懂负载均衡算法...
- docker安装jenkins并用docker部署net
- 如何使用 C# 中的 Tuple