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?
深圳网站制作平台,深圳市做网站好的公司有哪些?

