赞
踩
目录
后端使用.net6开发,长链接选择了微软的signalr而非原生的websocket
前端uniapp下vue3类型开发的app,需要通过长链接获取后端推送的消息
npm install @microsoft/signalr
虽然安装和前端一样,但是无法像前端一样使用
uniapp提供renderjs来帮助完成操作DOM、运行web端js库等功能
https://uniapp.dcloud.net.cn/tutorial/renderjs.html#renderjsuni-app,uniCloud,serverlesshttps://uniapp.dcloud.net.cn/tutorial/renderjs.html#renderjs这里signalr作为web端的js库 就必须使用这种方法
官方使用的示例是以echarts库作为示例的,可以下载示例项目参考代码
这里我们选择[我的]'mine'页面
注意选择的tab页面需要是登录后首先进入的页面!因为需要用onMounted来启动signalr!
并在页面上添加元素
<view id='token' v-show='false'>{{token}}</view>
因为renderjs代码是无法调用uniapp的api的,所以只能通过这种方式获取缓存中的token
注意:不支持<script setup>
vue3的话 必须使用setup函数,并且将renderjs调用的函数return出去
- <script>
- export default {
- setup() {
- //提供给renderjs调用的函数
- const test = param => {
- //用来处理业务逻辑
- console.log('test',param}
- }
-
- return{
- test
- }
- }
- }
- </script>
renderjs里面封装signalr相关的代码
这里需要新建一个<script>标签,即同一个页面有两个script标签!
- <script lang="renderjs" module="signalr">
- const signalR = require("@microsoft/signalr");
- export default {
- data() {
- return {
- connection: null,
- connected: false,//当前signalr是否连接上
- token: ''//连接signalr 后台需要token身份验证
- }
- },
- mounted() {
- setInterval(() => {
- this.start()
- }, 10 * 1000)
- },
- methods: {
- start() {
- let token = document.getElementById('token').innerHTML
- if (!token) {
- this.clear()
- return
- } else {
- if (token === this.token) {
- //token没变
- if (this.connection) {
- if (!this.connected) {
- // 还没连上 重新连
- this.connect()
- }
- } else {
- this.init(token)
- this.connect()
- }
- } else {
- //token变了 重新建立连接!
- this.token = token
- this.clear()
- this.init(token)
- this.connect()
- }
- }
- },
- clear() {
- //清空signalr
- this.disconnect()
- this.connection = null
- },
- async connect() {
- //连接signalr
- try {
- await this.connection.start()
- this.connected = true
- } catch (err) {
- this.connected = false
- }
- },
- async disconnect() {
- if (this.connection) {
- await this.connection.stop()
- this.connected = false
- } else {
- this.connected = false
- }
- },
- init(token) {
- this.connection = new signalR.HubConnectionBuilder()
- .withUrl(你的服务器signalrUrl, {
- accessTokenFactory: () => token
- })
- .configureLogging(signalR.LogLevel.Information)
- .build();
- this.connection.onclose(async error => {
- this.connected = false
- })
- this.connection.on(你的signalr方法名称, res => {
- //!!重要!! 调用实际业务逻辑方法(之前定义的test方法)
- this.$ownerInstance.callMethod('test', res)
- })
- }
- }
- }
-
-
-
- </script>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。