使用通用websocket連線asp.net core signalr
一、背景介紹
signalr的功能很強大,可以為我們實現websocket服務端節省不少的時間。但是可能由於不同的環境,我們在對接前端的時候總會很麻煩。雖然微軟為我們提供了前端的包,但是總有一些不能用的地方。
首先我們要知道 signalr在進行websocket 連線的時候都做了什麼
1.首先請求介面獲取connectionId 這個我們待會要用到 我們用post請求 http://localhost:5000/chatHub/negotiate,這裡chatHub是我們startup中的名稱
2.接下來就是連線websocket了,這裡我用的是uniapp裡面的方法,用原生方法也是一樣的,知道怎麼連的就行了
```
this.token = res.data.connectionId
uni.connectSocket({
url: 'ws://192.168.1.211:5000/chatHub?id=' + _this.token,
method: 'GET',
success: function() {}
});
uni.onSocketOpen(function(res) {
// 連線後傳送協議 {"protocol":"json", "version":1}
// 這裡注意signalr傳送的訊息以 0x1e 分割和結尾
_this.sendSocketMessage(`{"protocol":"json", "version":1}${String.fromCharCode(0x1e)}`)
console.log('WebSocket連線已開啟!');
});
uni.onSocketMessage(function(res) {
//接收資料
let msg = res.data.split(String.fromCharCode(0x1e)); //處理資料
for (let item in msg) {
if (msg[item]) {
let a = JSON.parse(msg[item])
if (a.type === 1) {
var ajson = { //前端定義一個方法 供後端呼叫,並傳入引數
"Show": _this.Show(...a.arguments)
} //target表示要呼叫的方法
ajson[a.target];
}
}
}
});
//定義show方法
Show(...arg) {
this.list.push({
ss: arguments[0],
con: arguments[1]
});
uni.setStorageSync('1',this.list)
this.value = '';
},
//
sendSocketMessage: function(msg) {
if (true) { //這裡要判斷一下連線是否開啟,我這裡是隨便寫的,也完全沒有做任何封裝,需要的自己封裝一下
uni.sendSocketMessage({
data: msg,
fail(res) {
//console.log(123)
}
});
} else {
}
},
handle(){
//傳送訊息 arguments 呼叫後端方法的引數,target 要呼叫的後端的目標函式的名稱 最後加上結束符
this.sendSocketMessage(
`${JSON.stringify({"arguments":[this.user,this.value],"invocationId":"0","streamIds":[],"target":"SendMsg","type": 1})}${String.fromCharCode(0x1e)}`
)
}
```
本文參考:https://www.cnblogs.com/weihanli/p/11538220.html