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

什么是Asp.Net Core SignalR

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

功能

  • 自动管理连接
  • 允许同时广播到所有客户端
  • 也可以广播到指定的组或者特定的客户端
  • 在Github上开源,传送门

SignalR 提供了多种连接方式,在现代化应用中,WebSocket是最佳的传输协议,在客户端无法实现WebSocket协议的时候,SignalR就会采取其他方式,比如Server-Sent或者长轮询(在ws未出现之前,我们讨论的推拉模式)

中心 Hubs

SignalR是采用中心客户端和服务器进行通讯。

中心是一种高级的管道,允许客户端和服务器之间相互调用方法。

中心通过强类型参数传递给方法,进行模型绑定

Hubs.Clients

Clients属性包含了所有的客户端连接信息,它包含了3个属性:

  • All 所有客户端
  • Caller 进行此次请求的客户端
  • Others 排除此次请求客户端的其他客户端 包含了多个方法: = AllExcept 在指定的连接除外的所有连接的客户端上调用方法
  • Client 在特定连接的客户端上调用方法
  • Clients 在特定连接的客户端上调用方法
  • Group 调用指定的组中的一种对所有连接方法
  • GroupExcept 调用中指定的组,除非指定连接到的所有连接的方法
  • Groups 调用一种对多个组的连接方法
  • OthersInGroup 调用一种对一组的连接,不包括客户端调用 hub 方法方法
  • User 调用一种对与特定用户关联的所有连接方法
  • Users 调用一种对与指定的用户相关联的所有连接方法

每个属性和方法返回的对象都包含一个SendAsync方法,可以对客户端进行调用。

HubContext

可以在应用其他地方通过使用IHubContext,达到调用Hub的目的。

两种协议

MessagePack类似于JSON,但传输比JSON更快,数据大小比JSON更小

服务器事项

  • 创建的Hub必须继承Microsoft.AspNetCore.SignalR.Hub,Hub类已经包含了管理连接、组和发送接收消息的属性及事件
  • 在Hub中使用的方法应该尽量使用异步的方式,因为SignalR在发送和接收消息的时候使用的是异步方法。
  • Startup.ConfigureServices中通过services.AddSignalR对SignalR进行注册
  • Startup.Configure中通过app.UseSignalR方法对Hub路由进行配置

代码解析

微软官方示范中的ChatHub:

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

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

上述代码为当收到客户端发来的SendMessage请求后(发送聊天信息),我们把消息发送到所有客户端,让他们调用自身的ReceiveMessage方法。

用户标识

通常情况下,在用户进行连接后,Connection会保存用户的用户标识,以便对特定用户进行发送消息。

可以实现IUserIdProvider来自定义获取用户的方法,例如:

public class CustomUserIdProvider : IUserIdProvider
{
    public virtual string GetUserId(HubConnectionContext connection)
    {
        return connection.User?.FindFirst(ClaimTypes.Email)?.Value;
    }
}

Startup.ConfigureServices中注册:

    services.AddSingleton<IUserIdProvider, CustomUserIdProvider>();

Group 分组

分组类似于聊天室中的每个房间,通过分组,我们可以给特定小组发送消息。

用户标识和组名称都是区分大小写的。

微信小程序与SignalR交互

小程序因为无法直接使用websocket,所以无法使用signalR.js,你可以试着把signalR.js中的webcosket使用部分换成wx.xxSocketxxx。

在参考了算神代码后,归了一个小类库,方便大家使用,源码较长,我放到了github上,点击【传送门】进入。

如何使用

调用类库

在要使用的页面上:

///引入这个类库
var signalR = require('../../lib/signalr/signalr.js')
///实例化一个对象
let _client = new signalR.signalR();

创建 一个映射方法

这是为了让小程序收到SignalR的消息之后进行回调

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

例子里有一个sayHello方法,我们用字符串作为key。

进行连接

_client.connection(url, methodMapping);
  • url : signalR服务器
  • methodMapping : 方法和字符串之间的Mapping

调用SignalR方法

 _client.call(methodName, args, success, fail)
  • methodName:远程方法名
  • args:参数,这里注意一定要数组格式
  • success:调用成功后的回调
  • fail:失败后的回调

写在最后

最近真的忙,忙成一道闪电,正好遇到这个问题随之记录下。类库可能并不完善,你可以在github上提issue,我会跟进的,有好的修改方式,你也可以PR我。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和未来有约会

Silverlight体积优化

Silverlight体积优化 Silverlight是运行在客户端的富媒体应用程序,他可以使表现形式更加的丰富多彩,相应的开发人员需要写大量的XAML、代买...

22880
来自专栏草根专栏

asp.net core 2.0 查缺补漏

asp.net core 2.0 一些有用有趣的设置. 面向(targeting)不同的.net版本: 打开asp.net core 2.0的项目文件: xxx...

32150
来自专栏Java帮帮-微信公众号-技术文章全总结

02.Linux安装

02.Linux安装 Linux 安装 本章节我们将为大家介绍Linux的安装。 本章节以 centos6.4 为例。 centos 下载地址: 可以去官网下载...

830110
来自专栏Java帮帮-微信公众号-技术文章全总结

IntelliJ IDEA 设置JVM运行参数

打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions 文件,需针对不同的JDK进行配置:

1.1K30
来自专栏Ken的杂谈

基于GitLab的Code Review教程

也就是说,使用GitLab进行Code Review就是在分支合并环节发起Merge Request,然后Code Review完成后将代码合并到目标分支。

2K30
来自专栏转载gongluck的CSDN博客

程序的入口

操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置, 不同的连接器选择的入口函数也不尽相同。在VC++下,连接...

38790
来自专栏张善友的专栏

ASP.NET Web API 处理架构

这篇文章主要是介绍ASP.NET Web API的处理架构:当一个HTTP请求到达直到产生一个请求的过程。ASP.NET Web API 的处理架构图如下,主要...

31680
来自专栏张善友的专栏

.NET Migration工具

Migration是一种分布环境下的数据库同步工具,出现在Ruby on Rail框架里,MigratorDotNet是一个.NET类似于Ruby on Rai...

23790
来自专栏林德熙的博客

WPF 使用RPC调用其他进程

如果在 WPF 需要用多进程通信,一个推荐的方法是 WCF ,因为 WCF 是 RPC 计算。先来讲下 RPC (Remote Procedure Call) ...

17210
来自专栏技术点滴

远程线程注入引出的问题

远程线程注入引出的问题 一、远程线程注入基本原理 远程线程注入——相信对Windows底层编程和系统安全熟悉的人并不陌生,其主要核心在于一个Windows AP...

319100

扫码关注云+社区

领取腾讯云代金券