最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、引入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 時,可以通過鏈式方法配置連接的各個參數(shù)。以下是完整的參數(shù)配置寫法和說明:

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

1. withUrl

  • 作用:設置 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 構造函數(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

  • 作用:設置消息協(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:設置單個 HTTP 請求超時時間。
    .withUrl(url, { timeout: 15000 }) // 15秒
    

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

三、啟動連接

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

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

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

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

// 實時接收服務端信息(服務端-->客戶端)
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ā)送消息到服務器

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

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

六、實際應用場景

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

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

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

七、完整案例

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

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
    }
  },

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

3. 在 Vue 組件中使用

<script>
import signalR from '@/utils/signalR' // 導入工具類

export default {
  data() {
    return {
      connection: null,      // SignalR 連接實例
      message: '',           // 輸入框綁定的消息
      messages: [],         // 接收到的消息列表
      hubUrl: 'https://your-api.com/chatHub' // Hub 地址
    }
  },
  mounted() {
    this.initializeConnection()
  },
  beforeUnmount() {
    // 組件銷毀前關閉連接
    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ǎng)絡')
      }

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

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

      try {
        // 調(diào)用服務端 Hub 方法(假設方法名為 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. 服務端代碼(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");
});

關鍵注意事項

  • 跨域問題:確保服務端啟用 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 傳輸(需服務端支持):

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

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

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

總結 

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

相關文章

  • vue生成pdf文件步驟及pdf分頁隔斷處理方法

    vue生成pdf文件步驟及pdf分頁隔斷處理方法

    最近遇到一個需求,需要把內(nèi)容下載生成pdf文件,但轉換過程中內(nèi)容總是會被截斷,就很難受,從網(wǎng)上找到了解決辦法分享給大家,這篇文章主要給大家介紹了關于vue生成pdf文件步驟及pdf分頁隔斷處理的相關資料,需要的朋友可以參考下
    2024-02-02
  • 在vue中使用jsonp進行跨域請求接口操作

    在vue中使用jsonp進行跨域請求接口操作

    這篇文章主要介紹了在vue中使用jsonp進行跨域請求接口操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Vue中對拿到的數(shù)據(jù)進行A-Z排序的實例

    Vue中對拿到的數(shù)據(jù)進行A-Z排序的實例

    今天小編就為大家分享一篇Vue中對拿到的數(shù)據(jù)進行A-Z排序的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue實現(xiàn)原理this.$message實例詳解

    vue實現(xiàn)原理this.$message實例詳解

    這篇文章主要介紹了vue實現(xiàn)原理this.$message實例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • vue filter的四種用法小結

    vue filter的四種用法小結

    這篇文章主要介紹了vue filter的四種用法小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue首屏白屏問題的原因和解決方法講解

    Vue首屏白屏問題的原因和解決方法講解

    這篇文章主要介紹了Vue首屏白屏問題的原因和解決方法講解,Vue首屏白屏問題是指在頁面初次加載時,部分或全部內(nèi)容無法正常顯示,出現(xiàn)空白的情況。其原因可能是因為頁面渲染速度過慢,或者是因為網(wǎng)絡請求等問題導致數(shù)據(jù)無法及時加載
    2023-05-05
  • 一文詳解Vue?的雙端?diff?算法

    一文詳解Vue?的雙端?diff?算法

    這篇文章主要介紹了一文詳解Vue?的雙端?diff?算法,diff?算法是渲染器中最復雜的部分,也是面試的熱點問題。今天我們就通過?Vue?的?diff?算法來探究下diff?算法吧
    2022-06-06
  • vue如何動態(tài)設置class、動態(tài)設置style

    vue如何動態(tài)設置class、動態(tài)設置style

    這篇文章主要介紹了vue如何動態(tài)設置class、動態(tài)設置style,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue記事本實例詳解

    Vue記事本實例詳解

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)記事本功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • vue中axios解決跨域問題和攔截器的使用方法

    vue中axios解決跨域問題和攔截器的使用方法

    下面小編就為大家分享一篇vue中axios解決跨域問題和攔截器的使用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評論

万盛区| 介休市| 林州市| 钟山县| 平度市| 远安县| 常州市| 门头沟区| 桓台县| 白玉县| 乐东| 兴山县| 罗山县| 西峡县| 湘潭市| 建阳市| 梓潼县| 吐鲁番市| 新乡市| 邵东县| 界首市| 恩施市| 灌南县| 翼城县| 疏附县| 天津市| 合阳县| 多伦县| 鞍山市| 静海县| 宁蒗| 东港市| 墨竹工卡县| 永寿县| 松潘县| 厦门市| 襄汾县| 方城县| 丰原市| 中山市| 朝阳区|