使用websocket連線(對接)asp.net core signalr

天際層雲發表於2020-10-24

使用通用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

相關文章