基于vs2015 SignalR开发的微信小程序使用websocket实现聊天功能
一)前言
在微信小程上实现聊天功能,大致有三种方式:1)小程序云开发 2)购买第三方IM服务 3)使用自己的服务器自己开发。
这里重要讲使用自己的服务器自己开发,并且是基于vs的开发。
网上提供的解决方案大多都是使用Microsoft.AspNetCore.SignalR来完成,但是通过研究,发现以下问题
1)Microsoft.AspNetCore.SignalR必须基于.NET Framework 4.6.1以上和 .NET core 2.1以上,也就是vs2017以上,最好是vs2019
2)我的开发环境是vs2015,只能使用Microsoft.AspNet.SignalR来实现web端的websocket
【相关知识分享链接】
Microsoft.AspNet.SignalR实现web端聊天:https://www.cnblogs.com/lonelyxmas/p/9153983.html
Microsoft.AspNetCore.SignalR实现小程序端聊天:http://www.likecs.com/show-60549.html
AspNet和AspNetCore差异官方详解:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/version-differences?view=aspnetcore-2.2
二)初步的解决方案
了解清楚以上原因后,在目前环境不变的前提下,初步制定了几种解决方案:
1)使用小程序web-view组件
在小程序页面内嵌web-view组件,将自己的web页面放入,通过官方JSSDK实现交互,所有逻辑写在服务端。
注:1、不允许个人类型的小程序使用web-view组件。
2、web-view会自动铺满整个小程序页面,所有样式必须在web页面里写。
3、需要将web域名添加到web-view白名单。
4、iOS下若JSSDK接口调用无响应的情况,可在 web-view 的 src 后面加个#wechat_redirect解决。
5、iOS下若打开白屏,可用 encodeURIComponent(src)解决。
2)使用Node.js
具体使用请参考百度
3)通过请求连接
这是本文的重点,一切都因为没有深入了解websocket的机制,下面作详细介绍。
三)了解websocket机制
假设我在web端有一个聊天室页面,假设地址为https://www.test.com/chat.html,由于后端Startup.cs使用的是默认目录signalr
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin; [assembly: OwinStartup(typeof(Star.Web.Startup))]
namespace Star.Web
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();//启动SignalR默认目录:/signalr
}
}
}
浏览器F12打开(以谷歌为例),点击Network,然后刷新页面或在页面发送一个消息,在下面Name里分别会出现negotiate开头和connect开头的Url。
1)点击negotiate开头的url,在头文件中(Headers)的General的RequestURL,显示访问地址是:
//signalr的negotiate
https://www.text.com/signalr/negotiate?clientProtocol=2.1&clientName=……&connectionData=[{"name":"msghub"}]&_=1576127697147
整理后的含义为:https://域名/signalr/negotiate?clientProtocol=2.1&url参数&connectionData=[{"name":"Hub名字"}]&_=时间戳
其中:Hub名字就是继承Hub类里的[HubName("Hub名字")]
2)点击connect开头的url,在头文件中(Headers)的General的RequestURL,显示访问地址是:
//signalr的connect
wss://www.test.com/signalr/connect?transport=webSockets&clientProtocol=2.1&clientName=……&connectionToken=……&connectionData=[{"name":"msghub"}]&tid=1
整理后的含义为:wss://域名/signalr/connect?transport=webSockets&clientProtocol=2.1&url参数&connectionToken=Token字符串&connectionData=[{"name":"Hub名字"}]&tid=1
其中:Token字符串就是上一个请求返回的结果;tid好像是个自增ID,可有可无
3)当你发送消息,或长时间等待时,会发现Name里还会有start开头,send开头,ping开头的Url
其中start和ping是自动的,send为集线器hub类暴露的hub方法名
[HubMethodName("send")]
public void Send(string message)
{
……
}
在小程序端,以下代码将会报400错误,并打印“打开Socket,失败!”
wx.connectSocket({
url: 'wss://www.test.com/signalr',
header: {
'content-type': 'application/json'
},
success:function(e){
console.log("连接Socket,成功>>");
},
fail:function(e){
console.log("连接Socket,失败>>");
console.log(e)
}
}) wx.onSocketOpen(function() {
console.log("打开Socket,成功!")
}) wx.onSocketError(function(res) {
console.log("打开Socket,失败!")
console.log(res)
})
将上面的url改为以下带token的,则通过并打印“打开Socket,成功!”。注意url请用encodeURIComponent()编码一下
wss://www.test.com/signalr/connect?transport=webSockets&clientProtocol=2.1&clientName=%E7%8E%8B%E6%98%8E&connectionToken=hik62ZcX4LK%2B4GvaRZQgDOeG8r5vgAav9D0XnNx%2BJLas%2F702x8SLJihgcTgZnUilQpLZnkxCNp87ilCRPt1gTvtHn9mLj6QkWArcKHhQ8On4sLerDszn6XkLv69MN49U&connectionData=%5B%7B%22name%22%3A%22msghub%22%7D%5D&tid=2
打开小程序>>调试器>>Network>>Name下面点击connect开头的文件>>Headers,显示101链接成功!
四)结尾
websocket原理就是页面先发送一个请求给https://.../signalr/negotiate/...,得到返回的token字符串,再通过wss://.../signalr/connect/...进行websocket连接
只有了解了以上机制,就可以在小程序内写相应请求了,由于时间关系,不上具体小程序端详细代码了
【相关参考分享链接】
全国第一例使用SignalR连接小程序:https://www.cnblogs.com/Vam8023/p/9768216.html
在Vue page里访问 SignalR:https://blog.csdn.net/qq_28462305/article/details/98319703
基于vs2015 SignalR开发的微信小程序使用websocket实现聊天功能的更多相关文章
- 微信小程序实现即时通信聊天功能的实例代码
项目背景:小程序中实现实时聊天功能 一.服务器域名配置 配置流程 配置参考URL:https://developers.weixin.qq.com/miniprogram/dev/api/api-ne ...
- 基于NopCommerce框架开发的微信小程序UrShop
Urshop小程序商城 介绍 UrShop小程序商城 2.0发布啦,发布地址https://gitee.com/urselect/urshop UrShop 根据NopCommerce框架开发的,基于 ...
- 基于spring-boot的社区社交微信小程序,适合做脚手架、二次开发
基于spring-boot的社区社交微信小程序,适合做脚手架.二次开发 代码地址如下:http://www.demodashi.com/demo/13867.html 1 概述 笔者做的一个后端基于s ...
- 开发一个微信小程序项目教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...
- 全栈开发工程师微信小程序-上(下)
全栈开发工程师微信小程序-上(下) icon 图标 success, success_no_circle, info, warn, waiting, cancel, download, search, ...
- 开发一个微信小程序实例教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...
- 基于微信小程序的用户列表点赞功能
代码地址如下:http://www.demodashi.com/demo/13997.html 一.前言 (1).适合人群 1.微信小程序开发者 2.前端工程师 3.想入门学习小程序开发的人员 4.想 ...
- 开发一个微信小程序教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可. 2.注册成功后进入首页,在 小程序发布流程->小程序 ...
- 如何快速地开发一个微信小程序
如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...
随机推荐
- Idea创建maven项目 标签: idea 2016-12-28 21:51 605人阅读 评论(27) 收藏
很久之前就听说了idea,界面也的确比eclipse好看,不过一直没有机会使用,这两天试用了一下,代码提示方面的确很好用,不过使用习惯跟eclipse还是有一些差距的,下面介绍一下如何用idea创建一 ...
- el-table中加载图片问题
<el-table-column label="头像" width="100"> <template scope="scope&qu ...
- 01-常见Dos命令、Java历史、Java跨平台、配置Path环境变量、第一个HelloWorld例子
常见Dos命令 dir: 列出当前目录下的文件以及文件夹 md: 创建目录 rd: 删除目录 cd: 进入指定目录 del: 删除文件 copy: 复制文件 xcopy: 复制目录 tree: 列出目 ...
- QT自定义窗口
qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...
- 14 个你可能不知道的 JavaScript 调试技巧
了解你的工具可以极大的帮助你完成任务.尽管 JavaScript 的调试非常麻烦,但在掌握了技巧 (tricks) 的情况下,你依然可以用尽量少的的时间解决这些错误 (errors) 和问题 (bug ...
- 阿里云应用实时监控 ARMS 再升级,支持 Prometheus 开源生态
摘要: 应用实时监控服务 (ARMS) 是一款APM类的监控产品. 用户可基于 ARMS 的前端.应用.自定义监控,快速构建实时的应用性能和业务监控能力.ARMS 让所有性能问题“一屏了然”,不遗余力 ...
- HZOJ 星际旅行
正解欧拉路,其实看完题解还是挺简单的,由于对欧拉路这种东西没怎么接触过,所以考试时没想出来,知识还是有漏洞啊. 另外这题的题解写的也不是很清楚(可能大佬作者觉得这是一道送分题……),首先判断联通(注意 ...
- 「BZOJ2654」tree
「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...
- Object-c学习笔记十八-----NSPredicate
Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...
- POJ 1182食物链、
应用挑战程序设计那本书上的话: 对于每只动物i创建3个元素i—A,i—B,i—C,并用3xN个元素建立并查集.这个并查集维护如下信息: (1)i—x表示“i属于种类x” (2)并查集里的每一个组表示组 ...