日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

asp.net core 中使用 signalR(二)

發(fā)布時間:2023/12/4 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp.net core 中使用 signalR(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

asp.net core 使用 signalR(二)

Intro

上次介紹了 asp.net core 中使用 signalR 服務(wù)端的開發(fā),這次總結(jié)一下web前端如何接入和使用 signalR,本文主要分兩部分,一是直接使用?@aspnet/signalr?這個微軟開發(fā)好的 signalR 的客戶端,另一部分是使用 h5 原生的 websocket 直接連接 signalR 的 websocket

使用 signalR 客戶端

  • 安裝 signalr 客戶端 npm 包?npm install@aspnet/signalr--save

  • 獲取一個 connection

  • import * as signalR from "@aspnet/signalr"; // ... const connection = new signalR.HubConnectionBuilder() .withUrl(Constants.HubUrl, { accessTokenFactory: () => Constants.TestToken }) .build(); // accessTokenFactory 用于指定獲取 accessToken 的方式,如果不需要用戶登錄,不需要認(rèn)證沒有這個配置
  • 添加客戶端處理方法

  • connection.on("GameAnswerResultReceived", (result:any)=>{ showMessage(`收到問題:${result.QuestionId} 答案`, JSON.stringify(result)); }); connection.on("GameOver", (result: object)=>{ showMessage(`游戲結(jié)束`, `Game Over\n ${JSON.stringify(result)}`); });
  • 客戶端調(diào)用服務(wù)器端方法

    • 調(diào)用服務(wù)器端方法,沒有返回值

    connection.send("CheckQuestionAnswer", { QuestionId: questionId, Answer: tbMessage.value, }, gameId);
    • 調(diào)用服務(wù)器端方法并獲取返回值

    connection.invoke("CheckQuestionAnswer", { QuestionId: questionId, Answer: tbMessage.value, }, gameId) .then(result => { console.log(result); showMessage(`答案檢查結(jié)果:${result.Succeeded}`, JSON.stringify(result)); });

    websocket 直接連接 signalR

  • 創(chuàng)建 websocket 連接

  • let connection = new WebSocket(`${Constants.HubUrl}?access_token=${Constants.TestToken}`);
  • 連接成功后發(fā)送使用協(xié)議信息

  • signalr 發(fā)送的消息均以?0x1e?這個字符結(jié)尾,在發(fā)送消息的時候需要在消息的最后增加?0x1e?字符

    connection.onopen = (event) => { // console.log(event); connection.send(`{"protocol":"json", "version":1}${String.fromCharCode(0x1e)}`); }

    以上代碼表示我們要使用 JSON 的形式進(jìn)行消息的序列化,如果有較高的性能要求也可以使用 messagePack 二進(jìn)制序列化消息內(nèi)容(對瀏覽器要求較高,需要支持 xhr2)

  • 接受服務(wù)器端消息

  • connection.onmessage = (event) => { var msg = event.data.replace(String.fromCharCode(0x1e), ""); //替換消息結(jié)束符 console.log(`received message: ${msg}`); let eventData = JSON.parse(msg); if(eventData.type === 1 && eventData.target){ // type為1表示調(diào)用客戶端的某一個方法 let func: (...args:any[])=>any = callbacks[eventData.target]; if(func !== undefined){ func(...eventData.arguments); } } }
  • 定義客戶端方法

  • callbacks["GameAnswerResultReceived"] = (result:any)=>{ showMessage(`收到問題:${result.QuestionId} 答案`, JSON.stringify(result)); }; callbacks["GameOver"] = (result)=>{ showMessage(`游戲結(jié)束`, `Game Over\n ${JSON.stringify(result)}`); };
  • 調(diào)用服務(wù)器端方法

  • // 可以把這個方法擴(kuò)展為 WebSocket 的一個原型方法 function invokeMethod(webSocket: WebSocket, methodName:string, ...args: any[]) : Promise<void> { // type為1表示調(diào)用遠(yuǎn)程的方法(一個 RPC 調(diào)用),target為要調(diào)用的方法名稱,arguments為要調(diào)用的方法的參數(shù) webSocket.send(`${JSON.stringify({ arguments: args, target: methodName, type: 1, })}${String.fromCharCode(0x1e)}`); return Promise.resolve(); }

    Memo

    上面的完全基于 websocket 去連接 signalr 的代碼還有些簡陋,實際使用的話可以再修改優(yōu)化一下

    強(qiáng)類型調(diào)用服務(wù)器端的方法,自定義的話可以在 websocket 的基礎(chǔ)上封裝一下,signalr 強(qiáng)類型調(diào)用服務(wù)器端方法還沒找到解決辦法,不過問題不大,有興趣的話可以研究一下?signalR 源碼

    Reference

    • https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-2.2

    • https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr-typescript-webpack?view=aspnetcore-2.2&tabs=visual-studio

    • https://github.com/aspnet/AspNetCore/tree/master/src/SignalR

    • https://github.com/aspnet/SignalR-samples

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的asp.net core 中使用 signalR(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。