一)前言

在微信小程上实现聊天功能,大致有三种方式: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实现聊天功能的更多相关文章

  1. 微信小程序实现即时通信聊天功能的实例代码

    项目背景:小程序中实现实时聊天功能 一.服务器域名配置 配置流程 配置参考URL:https://developers.weixin.qq.com/miniprogram/dev/api/api-ne ...

  2. 基于NopCommerce框架开发的微信小程序UrShop

    Urshop小程序商城 介绍 UrShop小程序商城 2.0发布啦,发布地址https://gitee.com/urselect/urshop UrShop 根据NopCommerce框架开发的,基于 ...

  3. 基于spring-boot的社区社交微信小程序,适合做脚手架、二次开发

    基于spring-boot的社区社交微信小程序,适合做脚手架.二次开发 代码地址如下:http://www.demodashi.com/demo/13867.html 1 概述 笔者做的一个后端基于s ...

  4. 开发一个微信小程序项目教程

    一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...

  5. 全栈开发工程师微信小程序-上(下)

    全栈开发工程师微信小程序-上(下) icon 图标 success, success_no_circle, info, warn, waiting, cancel, download, search, ...

  6. 开发一个微信小程序实例教程

    一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...

  7. 基于微信小程序的用户列表点赞功能

    代码地址如下:http://www.demodashi.com/demo/13997.html 一.前言 (1).适合人群 1.微信小程序开发者 2.前端工程师 3.想入门学习小程序开发的人员 4.想 ...

  8. 开发一个微信小程序教程

    一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可. 2.注册成功后进入首页,在 小程序发布流程->小程序 ...

  9. 如何快速地开发一个微信小程序

    如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...

随机推荐

  1. Idea创建maven项目 标签: idea 2016-12-28 21:51 605人阅读 评论(27) 收藏

    很久之前就听说了idea,界面也的确比eclipse好看,不过一直没有机会使用,这两天试用了一下,代码提示方面的确很好用,不过使用习惯跟eclipse还是有一些差距的,下面介绍一下如何用idea创建一 ...

  2. el-table中加载图片问题

    <el-table-column label="头像" width="100"> <template scope="scope&qu ...

  3. 01-常见Dos命令、Java历史、Java跨平台、配置Path环境变量、第一个HelloWorld例子

    常见Dos命令 dir: 列出当前目录下的文件以及文件夹 md: 创建目录 rd: 删除目录 cd: 进入指定目录 del: 删除文件 copy: 复制文件 xcopy: 复制目录 tree: 列出目 ...

  4. QT自定义窗口

    qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...

  5. 14 个你可能不知道的 JavaScript 调试技巧

    了解你的工具可以极大的帮助你完成任务.尽管 JavaScript 的调试非常麻烦,但在掌握了技巧 (tricks) 的情况下,你依然可以用尽量少的的时间解决这些错误 (errors) 和问题 (bug ...

  6. 阿里云应用实时监控 ARMS 再升级,支持 Prometheus 开源生态

    摘要: 应用实时监控服务 (ARMS) 是一款APM类的监控产品. 用户可基于 ARMS 的前端.应用.自定义监控,快速构建实时的应用性能和业务监控能力.ARMS 让所有性能问题“一屏了然”,不遗余力 ...

  7. HZOJ 星际旅行

    正解欧拉路,其实看完题解还是挺简单的,由于对欧拉路这种东西没怎么接触过,所以考试时没想出来,知识还是有漏洞啊. 另外这题的题解写的也不是很清楚(可能大佬作者觉得这是一道送分题……),首先判断联通(注意 ...

  8. 「BZOJ2654」tree

    「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...

  9. Object-c学习笔记十八-----NSPredicate

    Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...

  10. POJ 1182食物链、

    应用挑战程序设计那本书上的话: 对于每只动物i创建3个元素i—A,i—B,i—C,并用3xN个元素建立并查集.这个并查集维护如下信息: (1)i—x表示“i属于种类x” (2)并查集里的每一个组表示组 ...