Vue结合SignalR实现前后端实时消息同步

发布时间 - 2026-01-11 03:19:15    点击率:

最近业务中需要实现服务器端与客户端的实时通信功能,对Signalr做了一点总结和整理。

SignalR 作为  ASP.NET 的一个库,能够简单方便地为应用提供实时的服务器端与客户端双向通信功能。

SignalR 在客户端方面有两种API:Connections 和 Hubs。

在特殊情况下,比如发送消息的格式是特定不变时,使用Connections API。

大多数情况下使用Hubs,因为它是 Connections API 更高级的一种实现,允许客户端与服务端相互直接调用方法。一个实际应用的具体场景,比如服务端获取到新订单时,调用客户端的打印方法,客户端打印完成后,调用服务端的订单状态更新方法。

下面介绍 Hubs 在前端的 API

generated proxy

当使用generated proxy的时候,在语法层面上可以更加简单地调用服务端方法,就像在服务端直接调用。

如下面是服务端的代码,表示新增一条聊天信息到列表

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

客户端调用的时候:

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 时,客户端调用的时候则是

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项目里面,如果前后端分离,不会这样引用:

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

而且在客户端方法中如果要使用多个事件处理器时,不能使用generated proxy。

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

1.如何建立连接

var connection = $.hubConnection('localhost:23123');//如果前后端为同一个端口,可不填参数。如果前后端分离,这里参数为服务器端的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'); });

需要注意的是,开始连接之前(调用 start 方法之前),最好注册至少一个事件处理方法,如果没有注册的话,Hubs的 OnConnected 方法将不会被调用,那么客户端的方法就不能被服务端调用(这容易埋坑,所以要提前注册方法)。

2.客户端如何调用服务器端方法
使用 invoke,注意调用服务器端的方法名首字母可以不大写,如果方法名称要限制必须大写,需要后端做配置。

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

3. 服务器端调用客户端方法

首先客户端要注册方法才能让服务器端调用,使用 on 方法注册。

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

4 在Vue项目中使用SignalR

首先安装 SignalR 的package,需要注意的是 SignalR 依赖 jQuery。

npm i signalr,jquery

为了方便,在webpack.base.conf.js中注册全局的jQuery

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

然后在main.js中引入 SignalR

import 'signalr'

这时候就可以在Vue项目中使用SignalR了,后端的相关配置暂时略过。

新建一个signalr.js

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

/*客户端调用服务器端方法*/
//更新订单打印次数
const updateOrderPrint = {
  name:'updateOrderPrint',
  method:function(data){
    console.log(data)
  }
}

/*服务器调用客户端方法*/
// 打印新订单
const printNewOrder = {
  name:'printNewOrder',
  method:function(data){
    console.log(data)
  }
}
const get = {
  name:'Get',
  method:function(data){
    console.log(data)
  }
}

//服务器端的方法
const serverMethodSets = [updateOrderPrint];
//客户端的方法
const clientMethodSets = [printNewOrder,get]; //将需要注册的方法放进集合

// 建立连接
export function startConnection() {
  let hub = $.hubConnection(process.env.HUB_API)
  let proxy = createHubProxy(hub) //需要先注册方法再连接
  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
}
// 手动创建proxy
export function createHubProxy(hub){
  let proxy = hub.createHubProxy(HUBNAME)
  // 注册客户端方法
  clientMethodSets.map((item)=>{
    proxy.on(item.name,item.method)
  })
  return proxy
}

这样,在组件引入signalr.js后调用startConnection方法即可建立连接。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Vue  # SignalR  # 消息同步  # vue使用stompjs实现mqtt消息推送通知  # vue实现消息的无缝滚动效果的示例代码  # 用Vue.extend构建消息提示组件的方法实例  # vue弹窗消息组件的使用方法  # 最简单的vue消息提示全局组件的方法  # vue 实现websocket发送消息并实时接收消息  # Vue $mount实战之实现消息弹窗组件  # 解决vue自定义全局消息框组件问题  # Vue中消息横向滚动时setInterval清不掉的问题及解决方法  # vue 自定义组件的写法与用法详解  # vue2.0 自定义组件的方法(vue组件的封装)  # vue从零实现一个消息通知组件的方法详解  # 客户端  # 服务端  # 后端  # 的是  # 需要注意  # 情况下  # 直接调用  # 就像  # 多个  # 则是  # 它是  # 能让  # 就不能  # 没有注册  # 有两种  # 要使  # 到新  # 大家多多  # 就可以  # 实际应用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网页制作模板网站推荐,网页设计海报之类的素材哪里好?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何处理和验证JSON类型的数据库字段  详解Android中Activity的四大启动模式实验简述  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel如何为API生成Swagger或OpenAPI文档  Bootstrap整体框架之JavaScript插件架构  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  java获取注册ip实例  HTML 中如何正确使用模板变量为元素的 name 属性赋值  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  如何用腾讯建站主机快速创建免费网站?  实例解析angularjs的filter过滤器  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  如何在服务器上三步完成建站并提升流量?  Laravel中的Facade(门面)到底是什么原理  如何正确下载安装西数主机建站助手?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Python文件流缓冲机制_IO性能解析【教程】  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何在搬瓦工VPS快速搭建网站?  如何用5美元大硬盘VPS安全高效搭建个人网站?  原生JS实现图片轮播切换效果  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  javascript中的try catch异常捕获机制用法分析  Linux系统运维自动化项目教程_Ansible批量管理实战  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  详解jQuery中的事件  JavaScript如何实现类型判断_typeof和instanceof有什么区别  ,网页ppt怎么弄成自己的ppt?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  如何用PHP快速搭建CMS系统?  如何快速搭建FTP站点实现文件共享?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Android okhttputils现在进度显示实例代码  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何利用DOS批处理实现定时关机操作详解  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  深圳网站制作平台,深圳市做网站好的公司有哪些?