欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端vue中使用signalr的方法舉例詳解

 更新時間:2025年07月09日 09:36:04   作者:小芝麻咿呀  
在現(xiàn)代Web應(yīng)用程序中,即時通訊功能已成為不可或缺的一部分,下面這篇文章主要介紹了前端vue中使用signalr的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、引入SignalR庫

使用NPM引入SignalR庫

npm install @microsoft/signalr

Js文件中引入

import * as signalR from '@microsoft/signalr';

二、初始化連接

這一步需要指定SignalR Hub的URL。

const connection = new signalR.HubConnectionBuilder()
	.withUrl("https://yourserver.com/hub/myhub")
	.build();

參數(shù)說明

在使用 SignalR 的 HubConnectionBuilder 時,可以通過鏈?zhǔn)椒椒ㄅ渲眠B接的各個參數(shù)。以下是完整的參數(shù)配置寫法和說明:

const connection = new signalR.HubConnectionBuilder()
    // 必填:設(shè)置 Hub 的 URL
    .withUrl(url, options) 
    // 可選:配置日志
    .configureLogging(logging) 
    // 可選:配置自動重連
    .withAutomaticReconnect(retryPolicy) 
    // 可選:配置自定義 HTTP 客戶端
    .withHubProtocol(protocol) 
    // 構(gòu)建連接對象
    .build();

1. withUrl

  • 作用:設(shè)置 SignalR Hub 的 URL 和連接選項。
  • 參數(shù).withUrl(url: string, options?: IHttpConnectionOptions)
    .withUrl("https://example.com/chathub", {
      transport: signalR.HttpTransportType.WebSockets | signalR.HttpConnectionOptions.LongPolling,    // 自定義傳輸方式(默認為自動選擇)
      accessTokenFactory: () => "your-access-token",      // 身份驗證 Token(如 JWT)
      httpClient: customHttpClient,      // 自定義 HTTP 客戶端(如修改超時時間)
      skipNegotiation: true,       // 跳過協(xié)商步驟(僅適用于 WebSocket)
      headers: { "X-Custom-Header": "value" },        // 自定義請求頭
      // WebSocket 配置
      websocket: {
        // 自定義 WebSocket 構(gòu)造函數(shù)(如代理)
        constructor: CustomWebSocket,
      },
      // 是否使用默認的 `fetch` API(默認為 true)
      useDefaultFetch: false,
    })
    

2. configureLogging

  • 作用:配置日志級別或自定義日志記錄器。
  • 參數(shù).configureLogging(logging: LogLevel | ILogger)
  • 示例
    // 簡單配置日志級別
    .configureLogging(signalR.LogLevel.Information)
    
    // 自定義日志記錄器
    .configureLogging({
      log(logLevel, message) {
        console.log(`[SignalR] ${logLevel}: ${message}`);
      }
    })
    

3. withAutomaticReconnect

  • 作用:配置自動重連策略。
  • 參數(shù).withAutomaticReconnect(retryPolicy?: RetryPolicy)
    // 默認策略:重試 0次、3次、10次、30次 后停止
    .withAutomaticReconnect()
    
    // 自定義重試間隔數(shù)組(單位:毫秒)
    .withAutomaticReconnect([0, 2000, 5000, 10000, 30000])
    
    // 高級策略:實現(xiàn) `RetryPolicy` 接口
    .withAutomaticReconnect({
      nextRetryDelayInMilliseconds(retryContext) {
        if (retryContext.elapsedMilliseconds < 60000) {
          return Math.random() * 1000; // 隨機延遲 <1s
        }
        return null; // 停止重連
      }
    })
    

4. withHubProtocol

  • 作用:設(shè)置消息協(xié)議(默認為 JSON)。
  • 參數(shù).withHubProtocol(protocol: IHubProtocol)
  • 示例
    // 使用 MessagePack 二進制協(xié)議
    .withHubProtocol(new signalR.protocols.msgpack.MessagePackHubProtocol())
    
    // 自定義協(xié)議(需實現(xiàn) IHubProtocol)
    

5. build

  • 作用:生成最終的 HubConnection 實例。
  • 示例
    .build();
    

完整示例

const connection = new signalR.HubConnectionBuilder()
    .withUrl("https://example.com/chathub", {
        transport: signalR.HttpTransportType.WebSockets,
        accessTokenFactory: () => localStorage.getItem("token"),
        skipNegotiation: true,
        headers: { "X-Client-Version": "1.0.0" }
    })
    .configureLogging(signalR.LogLevel.Debug)
    .withAutomaticReconnect([0, 1000, 5000, 10000])
    .withHubProtocol(new signalR.protocols.msgpack.MessagePackHubProtocol())
    .build();

// 啟動連接
connection.start()
    .then(() => console.log("Connected!"))
    .catch(err => console.error("Connection failed:", err));

其他配置(通過 withUrl 的 options)

  • withCredentials:跨域請求攜帶 Cookie。
    .withUrl(url, { withCredentials: true })
    
  • timeout:設(shè)置單個 HTTP 請求超時時間。
    .withUrl(url, { timeout: 15000 }) // 15秒
    

根據(jù)實際需求選擇配置項,確保兼容 SignalR 客戶端庫的版本。

三、啟動連接

啟動連接是指讓前端與SignalR Hub建立實際的連接。

connection.start().then(() => {
	console.log("SignalR Connected.");
}).catch(err => {
    console.error(err.toString());
});

四、定義客戶端方法(客戶端接收服務(wù)端信息)

客戶端方法是指SignalR Hub調(diào)用時客戶端執(zhí)行的函數(shù)。通過這些方法,前端可以響應(yīng)來自服務(wù)器的實時通知。

// 實時接收服務(wù)端信息(服務(wù)端-->客戶端)
connection.on('監(jiān)聽后端命名的方法A返回的數(shù)據(jù):名稱一般和invoke配套',(message) => {
	console.log('接受的信息Info message:', message);
	// 做一些賦值操作,把后端傳來的數(shù)據(jù)渲染到頁面
});
// 例:
connection.on("ReceiveMessage", (user, message) => {
    const msg = `${user}: ${message}`;
    const li = document.createElement("li");
    li.textContent = msg;
    document.getElementById("messagesList").appendChild(li);
});

五、發(fā)送消息到服務(wù)器

前端可以通過調(diào)用SignalR Hub的方法來發(fā)送消息到服務(wù)器。通常,這些方法是用戶操作(如點擊按鈕)觸發(fā)的。

// 客戶端與服務(wù)端進行溝通(客戶端-->服務(wù)端),客戶端調(diào)取后端的方法進行通訊,后端返回信息
connection.invoke("后端命名的方法A", "一些后端需要的變量根據(jù)自己需求填寫")
// 例:
connection.invoke('SendData', 'Hello, SignalR!');

六、實際應(yīng)用場景

  • 實時聊天應(yīng)用
    使用SignalR最常見的場景之一就是實時聊天應(yīng)用。通過SignalR,可以實現(xiàn)客戶端之間的實時消息傳遞。

  • 實時數(shù)據(jù)更新
    SignalR也可以用于實時數(shù)據(jù)更新,如股票行情、體育比賽比分等。這些應(yīng)用需要頻繁地從服務(wù)器獲取最新數(shù)據(jù),并實時更新到前端界面。

  • 通知系統(tǒng)
    在一些應(yīng)用中,當(dāng)有新的事件發(fā)生時,需要實時通知用戶。例如,在電商平臺中,當(dāng)有新的訂單或者庫存變化時,需要及時通知管理員。

七、完整案例

以下是一個在 Vue 3 中使用 SignalR 實現(xiàn)連接、發(fā)送和接收數(shù)據(jù)的完整案例,包含詳細注釋和關(guān)鍵配置:

1. 安裝依賴

npm install @microsoft/signalr

2. 創(chuàng)建 SignalR 工具類(可選)

在 src/utils/signalR.js 中封裝連接邏輯:

import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr'

export default {
  // 創(chuàng)建連接
  createConnection(url, options = {}) {
    return new HubConnectionBuilder()
      .withUrl(url, options)
      .withAutomaticReconnect([0, 2000, 10000, 30000]) // 自定義重連策略
      .configureLogging(LogLevel.Information)
      .build()
  },

  // 啟動連接
  async startConnection(connection) {
    try {
      await connection.start()
      console.log('SignalR 連接成功')
      return true
    } catch (err) {
      console.error('SignalR 連接失敗:', err)
      return false
    }
  },

  // 關(guān)閉連接
  async stopConnection(connection) {
    if (connection) {
      await connection.stop()
      console.log('SignalR 連接已關(guān)閉')
    }
  }
}

3. 在 Vue 組件中使用

<script>
import signalR from '@/utils/signalR' // 導(dǎo)入工具類

export default {
  data() {
    return {
      connection: null,      // SignalR 連接實例
      message: '',           // 輸入框綁定的消息
      messages: [],         // 接收到的消息列表
      hubUrl: 'https://your-api.com/chatHub' // Hub 地址
    }
  },
  mounted() {
    this.initializeConnection()
  },
  beforeUnmount() {
    // 組件銷毀前關(guān)閉連接
    signalR.stopConnection(this.connection)
  },
  methods: {
    // 初始化連接
    async initializeConnection() {
      // 創(chuàng)建連接實例
      this.connection = signalR.createConnection(this.hubUrl, {
        accessTokenFactory: () => localStorage.getItem('token') // 身份驗證(可選)
      })

      // 注冊接收消息的回調(diào)
      this.connection.on('ReceiveMessage', (user, message) => {
        this.messages.push({ user, message })
      })

      // 啟動連接
      const success = await signalR.startConnection(this.connection)
      if (!success) {
        alert('連接服務(wù)器失敗,請檢查網(wǎng)絡(luò)')
      }

      // 監(jiān)聽連接關(guān)閉事件
      this.connection.onclose(() => {
        console.log('連接已斷開')
      })
    },

    // 發(fā)送消息
    async sendMessage() {
      if (!this.message.trim()) return

      try {
        // 調(diào)用服務(wù)端 Hub 方法(假設(shè)方法名為 SendMessage)
        await this.connection.invoke('SendMessage', this.message)
        this.message = ''
      } catch (err) {
        console.error('發(fā)送消息失敗:', err)
        alert('發(fā)送失敗,請重試')
      }
    }
  }
}
</script>

<template>
  <div>
    <h2>聊天室</h2>
    <div class="message-list">
      <div v-for="(msg, index) in messages" :key="index">
        <strong>{{ msg.user }}:</strong> {{ msg.message }}
      </div>
    </div>
    <input v-model="message" @keyup.enter="sendMessage" placeholder="輸入消息" />
    <button @click="sendMessage">發(fā)送</button>
  </div>
</template>

4. 服務(wù)端代碼(C# ASP.NET Core 示例)

// Hub 類
public class ChatHub : Hub
{
    // 客戶端調(diào)用此方法發(fā)送消息
    public async Task SendMessage(string message)
    {
        // 廣播消息給所有客戶端(方法名 ReceiveMessage 需與前端匹配)
        await Clients.All.SendAsync("ReceiveMessage", Context.User.Identity.Name, message);
    }
}

// Startup.cs 或 Program.cs 中配置
app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<ChatHub>("/chatHub");
});

關(guān)鍵注意事項

  • 跨域問題:確保服務(wù)端啟用 CORS:

    services.AddCors(options => options.AddPolicy("AllowAll", builder =>
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader()));
    
  • 身份驗證:如果使用 JWT,需在 withUrl 配置中傳遞 Token:

    .withUrl(this.hubUrl, {
      accessTokenFactory: () => localStorage.getItem('token')
    })
    
  • 協(xié)議兼容:默認使用 JSON 協(xié)議,如需二進制優(yōu)化可切換為 MessagePack:

    import { MessagePackHubProtocol } from '@microsoft/signalr-protocol-msgpack'
    this.connection = new HubConnectionBuilder()
      .withHubProtocol(new MessagePackHubProtocol())
    
  • 錯誤處理:建議全局監(jiān)聽錯誤:

    this.connection.onreconnecting((error) => {
      console.log('正在嘗試重新連接...', error)
    })
    
  • 性能優(yōu)化:在頻繁通信場景下,建議使用 WebSocket 傳輸(需服務(wù)端支持):

    .withUrl(url, { transport: HttpTransportType.WebSockets })
    

通過這個案例,你可以快速實現(xiàn):

  • SignalR 長連接管理
  • 消息的發(fā)送和實時接收
  • 自動重連和錯誤處理
  • 與 Vue 3 生命周期的無縫集成

總結(jié) 

到此這篇關(guān)于前端vue中使用signalr的文章就介紹到這了,更多相關(guān)前端vue使用signalr內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue單頁面改造多頁面應(yīng)用的全過程記錄

    vue單頁面改造多頁面應(yīng)用的全過程記錄

    眾所都知vue是一個單頁面應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于vue單頁面改造多頁面應(yīng)用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • 值得收藏的vuejs安裝教程

    值得收藏的vuejs安裝教程

    這篇文章主要為大家分享了一篇值得收藏的vuejs安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • vue3實現(xiàn)el-table分批渲染表格

    vue3實現(xiàn)el-table分批渲染表格

    這篇文章主要為大家詳細介紹了vue3項目中如何實現(xiàn)el-table分批渲染表格,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • axios取消請求的實踐記錄分享

    axios取消請求的實踐記錄分享

    今天小編就為大家?guī)硪黄猘xios取消請求的實踐記錄分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • webpack&webpack-cli完全卸載過程

    webpack&webpack-cli完全卸載過程

    本文介紹了如何刪除全局和本地的webpack及其CLI,并提供了檢查webpack殘余文件的方法,總結(jié)了個人的操作經(jīng)驗,旨在為讀者提供參考,并期待獲得更多支持
    2024-09-09
  • 使用 vue 實例更好的監(jiān)聽事件及vue實例的方法

    使用 vue 實例更好的監(jiān)聽事件及vue實例的方法

    這篇文章主要介紹了使用 vue 實例更好的監(jiān)聽事件及vue實例的方法,介紹了一種新增 vue 實例的方法,單獨監(jiān)聽事件,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Vue組件數(shù)據(jù)傳遞與props校驗方式

    Vue組件數(shù)據(jù)傳遞與props校驗方式

    這篇文章主要介紹了Vue組件數(shù)據(jù)傳遞與props校驗方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Vue之組件詳解

    Vue之組件詳解

    這篇文章主要為大家介紹了Vue之組件,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • vue下拉列表功能實例代碼

    vue下拉列表功能實例代碼

    這篇文章主要介紹了vue下拉列表功能實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • vue寫h5頁面的方法總結(jié)

    vue寫h5頁面的方法總結(jié)

    在本篇內(nèi)容里小編給大家整理了關(guān)于vue寫h5頁面的方法以及注意點分析,有需要的朋友們跟著學(xué)習(xí)下吧。
    2019-02-02

最新評論