前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信小程序如何使用原生Websocket api与Asp.Net Core SignalR 通信

微信小程序如何使用原生Websocket api与Asp.Net Core SignalR 通信

作者头像
乔达摩@嘿
发布2023-07-10 16:32:52
5840
发布2023-07-10 16:32:52
举报
文章被收录于专栏:嘿dotNet嘿dotNet

背景

如题,这可能算是.net 做小程序的服务端时,绕不开的一个问题,老生常谈了。同样的问题,我记得我2018/19年的一个项目的解决方案是:

修改官方的SignalR.js的客户端:把里面用到浏览器的Websocket改成微信小程序的官方api的。目前网上也有不少这样的方案,已经改好开源了;这种方案的缺点是可能有一段时间了,可能跟目前自己的服务端版本不兼容,跟目前自己微信小程序的运行环境不兼容。或者已经有些隐藏bug等等,用上写好业务了再发现bug头疼得很。使用起来很没有安全感;

我现在这里的方案是:

直接使用微信小程序的Websocket的原生api与服务端通信;

原生api文档:https://developers.weixin.qq.com/minigame/dev/api/network/websocket/wx.connectSocket.html

服务端

运行环境:.net core 6 On Linux(k8s)ubuntu 18.04

目前已有一个SignalR的Hub:SmartCutHub.cs

image-20230614160716902
image-20230614160716902

可以看到只有红圈函数GenerateVideoScript()接收一个强类型的参数:GenerateVideoScriptDto

ps:强类型参数传参时跟webapi一样用json对象即可;

Program.cs注册:

代码语言:javascript
复制
app.MapHub<SmartCutHub>("/ws/smartcut");
    
//所以路由是
ws://localhost:5055/ws/smartcut

小程序端

创建连接

这里代码是用的微信小程序原生api,请参考文档

代码语言:javascript
复制
var wsUrl = "ws://localhost:5055/ws/smartcut";

//创建连接
var conn= await wx.connectSocket({
    url: wsUrl,
    fail(err)
    {
        console.error(err)
    },
    success()
    {
        console.info(wsUrl+"链接成功")
    }
})

//创建连接成功
this.connection=conn;
let that=this;

发送消息

这里的步骤不能省略

代码语言:javascript
复制
conn.onOpen(function (res)
{
    console.log("SocketOpened");

    //先要确认协议,版本
    that.sendStrMsg("{\"protocol\":\"json\",\"version\":1}");
    //确认类型
    that.sendStrMsg("{\"type\":6}");
    
    //再发送消息内容
    that.sendStrMsg("{\"arguments\":[{\"scriptType\":\"口播类\",\"productName\":\"许愿池的王八\",\"productSpecialty\":\"在水里,爱许愿,晒太阳\",\"sceneCount\":5,\"sceneMini\":5,\"sceneMax\":10,\"remark\":\"\",\"language\":\"zh\",\"generateCount\":10}],\"invocationId\":\"0\",\"target\":\"GenerateVideoScript\",\"type\":1}");
})

注意这里的消息内容就是要求下格式:

代码语言:javascript
复制
{
	"arguments": [{
		"name": "wang"
	}], //你的参数
	"invocationId": "0",
	"target": "GenerateVideoScript", //服务端方法名
	"type": 1
}

发送消息函数

代码语言:javascript
复制
//这里发送字符串到服务端
sendStrMsg(msg)
{
	//连接成功后就示例好了
    if(this.connection)
    {
        console.info("准备发送:"+msg);
        this.connection.send({
            data: msg+"", //注意,msg这里后面这个特殊的字符不能省略
            fail(err)
            {
                console.error(err)
            },
            success(res)
            {
                console.info(res)
            },
            complete(res)
            {
                console.info(res)
            }
        });
    }
    else
    {
        console.error("ws连接不存在");
    }
}

总结

我其实这里这种方式是模拟浏览器端的Websocket传输过程的:

image-20230614163553493
image-20230614163553493

注意这里消息体后面一样有这个特殊字符的

也不算原创和多有技术含量,可能大家早就理清楚搞定了。但只要能帮到一位朋友我就开心了。ok,今天就水到这。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 服务端
  • 小程序端
  • 总结
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档