一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - ASP.NET Core+Vue3 實現SignalR通訊

ASP.NET Core+Vue3 實現SignalR通訊

2024-01-06 00:03未知服務器之家 ASP.NET教程

從ASP.NET Core 3.0版本開始,SignalR的Hub已經集成到了ASP.NET Core框架中。因此,在更高版本的ASP.NET Core中,不再需要單獨引用Microsoft.AspNetCore.SignalR包來使用Hub。 在項目創建一個類繼承Hub, 首先是寫一個CreateConnection方法 ConnectionId是Sign

從ASP.NET Core 3.0版本開始,SignalR的Hub已經集成到了ASP.NET Core框架中。因此,在更高版本的ASP.NET Core中,不再需要單獨引用Microsoft.AspNetCore.SignalR包來使用Hub。
在項目創建一個類繼承Hub,
首先是寫一個CreateConnection方法
ConnectionId是SignalR中標識的客戶端連接的唯一標識符,
將userId和ConnectionId關聯起來,這樣就可以實現指定給某一個或一些用戶發送消息了。
SendMessageToUser方法用于向特定的用戶發送消息。它接受兩個參數:userId表示要用于接收消息的用戶標識,message表示要發送的消息內容。
該方法的主要作用是根據userId從內存緩存(IMemoryCache)中獲取與之關聯的ConnectionId,然后使用Clients.Client(connectionId.ToString())方法找到對應的客戶端連接,并通過SendAsync方法將消息發送給該用戶。這樣,用戶就能收到特定的消息。

public class MyHub : Hub
{
    private readonly IMemoryCache memoryCache;

    public MyHub(IMemoryCache memoryCache)
    {
        this.memoryCache = memoryCache;
    }
    public void CreateConnection(int userId)
    {
        // 將用戶標識與 ConnectionId 關聯起來
        memoryCache.Set(userId, Context.ConnectionId);
    }
    public async Task SendMessageToUser(int userId, string message)
    {
        if (memoryCache.TryGetValue(userId, out var connectionId))
        {
            await Clients.Client(connectionId.ToString()).SendAsync("ReceiveMessage", message);
        }
    }
}

在program文件中注冊hub

//注冊signalr
builder.Services.AddSignalR();
//注冊hub  這里的路徑是我的Hub類在項目中的路徑
app.MapHub<MyHub>("/SignalR/MyHub");

ASP.NET Core+Vue3 實現SignalR通訊
———————————————————————————————————————————————————————————————————————————
讓后前端這里在vue項目中下載@microsoft/signalr包

npm i @microsoft/signalr --save

創建一個myHub.js文件

import * as signalr from '@microsoft/signalr';
const conn = new signalr.HubConnectionBuilder()
              .withUrl('http://localhost:5124/SignalR/Myhub')
              .withAutomaticReconnect()
              .build();
export default conn;

.withUrl('http://localhost:5124/SignalR/Myhub')這里的路徑一定要和在api項目中的Program配置的app.MapHub("/Signalr/Myhub");相同。
withAutomaticReconnect()用于啟用自動重連功能。這意味著如果連接斷開,SignalR將自動嘗試重新建立連接,以確保保持實時通信。
.build()方法構建并返回一個SignalR連接對象。
conn.start();和SignarlR啟動建立連接。

———————————————————————————————————————————————————————————————————————————
讓后的話這里簡單模擬了一下數據庫的登錄
Api部分

[Route("api/[controller]/[action]"), ApiController]
    public class TestController : ControllerBase
    {
        List<SysUser> userList = new List<SysUser>()
        {
            new SysUser(1,"王鶴棣","123456"),
            new SysUser(2,"吳磊","123456"),
            new SysUser(3,"趙露思","123456")
        };

        [HttpPost]
        public ActionResult Login(SysUser sysUser)
        {
            var user = userList.Where(s => s.userName == sysUser.userName && s.userPwd == sysUser.userPwd).FirstOrDefault();
            if (user is not null)
            {
                return Ok(user.userId);
            }
            return Ok("失敗");
        }
    }
    public record SysUser(int? userId,string userName,string userPwd);

Vue部分

<script setup>
import {ref,reactive,onMounted} from 'vue';
import axios from 'axios';
import myHub from './httpTools/myHub'; //導入hub
const loginUser=reactive({
  userName:'王鶴棣',
  userPwd:'123456',
});
const loginBtn= ()=>{
  axios.post('http://localhost:5159/api/test/login',loginUser)
  .then(async res => {
    console.log(res);
    alert('成功');
    //這里在登錄成功之后調用服務端在MyHub類的CreateConnection方法,
    //把登錄成功之后返回的userId傳過去
    //使客戶端與服務端建立連接
    if(myHub.state.toString()!="Connected"){
        await myHub.start();
    }
    myHub.invoke("CreateConnection",res.data);
  })
}

//這里的ReceiveMessage用于接受服務器發送的消息
//這個ReceiveMessage名字是自己定義的
onMounted(() => {
  myHub.on('ReceiveMessage', (message) => {
    console.log("MyHub接受到的消息:"+message);
    alert(message);
  })
})
const message=ref();
const sendUserId=ref();
const sendMessage=()=>{
  myHub.invoke("SendMessageToUser",Number(sendUserId.value),message.value)
}
</script>

<template>
  <input type="text" v-model.trim="loginUser.userName" placeholder="用戶名">
  <input type="text" v-model.trim="loginUser.userPwd" placeholder="密碼">
  <button @click="loginBtn">確定</button>
  <input type="text" v-model="message">
  <select  v-model="sendUserId">
    <option value="1">王鶴棣</option>
    <option value="2">吳磊</option>
    <option value="3">趙露思</option>
  </select >
  <button @click="sendMessage">發送消息</button>
</template>

ASP.NET Core+Vue3 實現SignalR通訊

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久99热狠狠色一区二区 | 乌克兰少妇大胆大BBW | 黑人巨鞭大战白妞10级 | 好男人资源在线观看免费的 | 免费操比视频 | 91精品国产综合久久精品 | 人人擦 | 青青青草国产线观 | 亚洲成综合人影院在院播放 | 免费看60分钟大片视频播放 | 青草青草伊人精品视频 | 成功精品影院 | 四虎黄色影视 | 丝瓜视频看污片 | 日韩porn| 国产一区二区不卡视频 | 大香焦在线 | 欧美精品一区二区在线观看 | 亚洲国产精品自在在线观看 | 胸奶好大好紧好湿好爽 | 日本hd18| 深夜激情网站 | 久久福利影院 | 国产成人免费 | 欧美一级裸片 | 香港论理午夜电影网 | 黑人k8经典| 久草在线福利视频在线播放 | 国内精品 大秀视频 日韩精品 | 日韩精品视频在线观看免费 | 欧美日韩中文国产一区 | 日本不卡1卡2卡三卡网站二百 | 美女扒开奶罩让男人吃奶 | 出差被灌醉绝伦的上司日本 | 成 人 免费 小说在线观看 | 拔插拔插8x8x海外华人免费视频 | 久久性综合亚洲精品电影网 | 星空无限传媒xk8046 | 国产资源一区 | 我与恶魔的h生活ova | 奇米影视7777 |