成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Vue結(jié)合SignalR實(shí)現(xiàn)前后端實(shí)時(shí)消息同步

最近業(yè)務(wù)中需要實(shí)現(xiàn)服務(wù)器端與客戶端的實(shí)時(shí)通信功能,對(duì)Signalr做了一點(diǎn)總結(jié)和整理。

旺蒼網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站

SignalR 作為  ASP.NET 的一個(gè)庫(kù),能夠簡(jiǎn)單方便地為應(yīng)用提供實(shí)時(shí)的服務(wù)器端與客戶端雙向通信功能。

SignalR 在客戶端方面有兩種API:Connections 和 Hubs。

在特殊情況下,比如發(fā)送消息的格式是特定不變時(shí),使用Connections API。

大多數(shù)情況下使用Hubs,因?yàn)樗?Connections API 更高級(jí)的一種實(shí)現(xiàn),允許客戶端與服務(wù)端相互直接調(diào)用方法。一個(gè)實(shí)際應(yīng)用的具體場(chǎng)景,比如服務(wù)端獲取到新訂單時(shí),調(diào)用客戶端的打印方法,客戶端打印完成后,調(diào)用服務(wù)端的訂單狀態(tài)更新方法。

下面介紹 Hubs 在前端的 API

generated proxy

當(dāng)使用generated proxy的時(shí)候,在語(yǔ)法層面上可以更加簡(jiǎn)單地調(diào)用服務(wù)端方法,就像在服務(wù)端直接調(diào)用。

如下面是服務(wù)端的代碼,表示新增一條聊天信息到列表

public class DemoChatHub : Hub
{
  public void NewChatMessage(string name, string message)
  {
    Clients.All.addMessageToList(name, message);
  }
}

客戶端調(diào)用的時(shí)候:

var demoChatHubProxy = $.connection.DemoChatHub;
demoChatHubProxy.client.addMessageToList = function (name, message) {
  console.log(name + ' ' + message);
};
$.connection.hub.start().done(function () {
 
  $('#newChatMessage').click(function () {
     demoChatHubProxy.server.newChatMessage($('#displayname').val(), $('#message').val());
   });
});

不使用 generated proxy 時(shí),客戶端調(diào)用的時(shí)候則是

var connection = $.hubConnection();
var demoChatHubProxy = connection.createHubProxy('demoChatHub');
demoChatHubProxy.on('addMessageToList', function(name, message) {
  console.log(name + ' ' + message);
});
connection.start().done(function() {
  $('#newChatMessage').click(function () {
    demoChatHubProxy.invoke('newChatMessage', $('#displayname').val(), $('#message').val());
    });
});

但是在Vue項(xiàng)目里面,如果前后端分離,不會(huì)這樣引用:

<script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>

而且在客戶端方法中如果要使用多個(gè)事件處理器時(shí),不能使用generated proxy。

因此后面的例子不采取generated proxy的方式。

1.如何建立連接

var connection = $.hubConnection('localhost:23123');//如果前后端為同一個(gè)端口,可不填參數(shù)。如果前后端分離,這里參數(shù)為服務(wù)器端的URL
var demoChatHubProxy = connection.createHubProxy('demoChatHub');
demoChatHubProxy.on('addMessageToList', function(userName, message) {
  console.log(userName + ' ' + message);
}); 
connection.start()
  .done(function(){ console.log('Now connected, connection ID=' + connection.id); })
  .fail(function(){ console.log('Could not connect'); });

需要注意的是,開始連接之前(調(diào)用 start 方法之前),最好注冊(cè)至少一個(gè)事件處理方法,如果沒有注冊(cè)的話,Hubs的 OnConnected 方法將不會(huì)被調(diào)用,那么客戶端的方法就不能被服務(wù)端調(diào)用(這容易埋坑,所以要提前注冊(cè)方法)。

2.客戶端如何調(diào)用服務(wù)器端方法
使用 invoke,注意調(diào)用服務(wù)器端的方法名首字母可以不大寫,如果方法名稱要限制必須大寫,需要后端做配置。

demoChatHubProxy.invoke('newChatMessage', {name:'a',message:'b'});

3. 服務(wù)器端調(diào)用客戶端方法

首先客戶端要注冊(cè)方法才能讓服務(wù)器端調(diào)用,使用 on 方法注冊(cè)。

demoChatHubProxy.on('addMessageToList', function(userName, message) {
  console.log(userName + ' ' + message);
});

4 在Vue項(xiàng)目中使用SignalR

首先安裝 SignalR 的package,需要注意的是 SignalR 依賴 jQuery。

npm i signalr,jquery

為了方便,在webpack.base.conf.js中注冊(cè)全局的jQuery

plugins: [new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
      'window.jQuery': 'jquery',
      'root.jQuery': 'jquery'
    })
  ]

然后在main.js中引入 SignalR

import 'signalr'

這時(shí)候就可以在Vue項(xiàng)目中使用SignalR了,后端的相關(guān)配置暫時(shí)略過。

新建一個(gè)signalr.js

import { Message } from 'element-ui';
const HUBNAME = 'DefaultHub';

/*客戶端調(diào)用服務(wù)器端方法*/
//更新訂單打印次數(shù)
const updateOrderPrint = {
  name:'updateOrderPrint',
  method:function(data){
    console.log(data)
  }
}

/*服務(wù)器調(diào)用客戶端方法*/
// 打印新訂單
const printNewOrder = {
  name:'printNewOrder',
  method:function(data){
    console.log(data)
  }
}
const get = {
  name:'Get',
  method:function(data){
    console.log(data)
  }
}

//服務(wù)器端的方法
const serverMethodSets = [updateOrderPrint];
//客戶端的方法
const clientMethodSets = [printNewOrder,get]; //將需要注冊(cè)的方法放進(jìn)集合

// 建立連接
export function startConnection() {
  let hub = $.hubConnection(process.env.HUB_API)
  let proxy = createHubProxy(hub) //需要先注冊(cè)方法再連接
  hub.start().done((connection) =>{
    console.log('Now connected, connection ID=' + connection.id)
  }).fail(()=>{
    Message('連接失敗' + error);
    console.log('Could not connect');
  })
  hub.error(function (error) {
    Message('SignalR error: ' + error);
    console.log('SignalR error: ' + error)
  })
  hub.connectionSlow(function () {
    console.log('We are currently experiencing difficulties with the connection.')
  });
  hub.disconnected(function () {
    console.log('disconnected')
  });
  return proxy
}
// 手動(dòng)創(chuàng)建proxy
export function createHubProxy(hub){
  let proxy = hub.createHubProxy(HUBNAME)
  // 注冊(cè)客戶端方法
  clientMethodSets.map((item)=>{
    proxy.on(item.name,item.method)
  })
  return proxy
}

這樣,在組件引入signalr.js后調(diào)用startConnection方法即可建立連接。

了解更多 https://github.com/SignalR/SignalR

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

新聞名稱:Vue結(jié)合SignalR實(shí)現(xiàn)前后端實(shí)時(shí)消息同步
當(dāng)前網(wǎng)址:http://jinyejixie.com/article20/jpdijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、、網(wǎng)站策劃、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
石景山区| 扶余县| 岳阳县| 观塘区| 抚州市| 孟津县| 慈利县| 盐城市| 弋阳县| 沂源县| 吉安县| 佛山市| 沂源县| 闻喜县| 贡嘎县| 新郑市| 巍山| 金堂县| 万载县| 通海县| 湛江市| 隆子县| 安庆市| 简阳市| 浑源县| 辽中县| 东台市| 新密市| 望城县| 汉阴县| 外汇| 仁化县| 赫章县| 长武县| 黔东| 榆树市| 平凉市| 甘谷县| 竹北市| 垫江县| 衡山县|