概述:ASP.NET Core SignalR是一种开放源代码库,可简化将实时 web 功能添加到应用程序的功能。 实时 web 功能使服务器端代码可以立即将内容推送到客户端。

这玩意的概念我就不多讲了,官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-3.0

今天这个demo,就是用SignalR 做服务端,vue做客户端。

以下演示皆为本地环境

先看看最终效果

上代码

先建一个项目,我core的版本是3.0,我选择的应用“Web应用程序”,其实我这创建的就跟官网的JavaScript教程一样的。

项目建好之后右键项目->添加>客户端库

按图上添加就好了

把Pages下面的Index视图的代码换成如下:

@page
<div class="container">
<div class="row">&nbsp;</div>
<div class="row">
<div class="col-2">User</div>
<div class="col-4"><input type="text" id="userInput" /></div>
</div>
<div class="row">
<div class="col-2">Message</div>
<div class="col-4"><input type="text" id="messageInput" /></div>
</div>
<div class="row">&nbsp;</div>
<div class="row">
<div class="col-6">
<input type="button" id="sendButton" value="Send Message" />
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<hr />
</div>
</div>
<div class="row">
<div class="col-6">
<ul id="messagesList"></ul>
</div>
</div>
<script src="~/js/signalr/dist/browser/signalr.js"></script>
<script src="~/js/chat.js"></script>

在放静态文件的wwwroot的js下面新建一个chat.js,并放入如下代码

"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();

//Disable send button until connection is established
document.getElementById("sendButton").disabled = true; connection.on("ReceiveMessage", function (user, message) {
var msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
var encodedMsg = user + " says " + msg;
var li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
}); connection.start().then(function () {
document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
return console.error(err.toString());
}); document.getElementById("sendButton").addEventListener("click", function (event) {
var user = document.getElementById("userInput").value;
var message = document.getElementById("messageInput").value;
connection.invoke("SendMessage", user, message).catch(function (err) {
return console.error(err.toString());
});
event.preventDefault();
});

添加SignalR中心,加个Hubs文件夹,加个ChatHub类

public class ChatHub : Hub
{
/// <summary>
/// 给所有客户端发送消息
/// </summary>
/// <param name="user">用户</param>
/// <param name="message">消息</param>
/// <returns></returns>
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
/// <summary>
/// 向调用客户端发送消息(备用)
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public async Task SendMessageCaller(string message)
{
await Clients.Caller.SendAsync("ReceiveCaller", message);
}
}

在Startup里配置SignalR

ConfigureServices里加上

services.AddSignalR();

Configure

         app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapHub<ChatHub>("/chathub");
});

看看效果

是不是有聊天室那味了。。

哎呀不对,标题咋不说要弄vue做客户端啊,咋现在还在这写视图呢。

那么接下来就用vue做客户端,我用的脚手架,引用vue.js也是能实现的。

先用脚手架建一个项目,把不要的东西都删除,只留下一个home.vue,记得路由里面也删除干净,要不然会报错的。

首先我们先安装前端的js包,上文也看到我们调用signalr中心有对应的js客户端

npm install @aspnet/signalr

安装好之后,我们开始写前端代码

在home.vue里面放两个输入框和一个按钮,和core的index视图差不多,样式就不美化,主要做效果。

    <input v-model="user" type="text" />
<input v-model="message" type="text" />
<button @click="sendAll">发送全部</button>

引用安装的@aspnet/signalr

import * as signalR from "@aspnet/signalr";

定义需要的变量

data() {
return {
user: "",//用户
message: "",//消息
connection: "",//signalr连接
messages: []//返回消息
};
},

定义页面加载连接signalr

created: function() {
let thisVue = this;
this.connection = new signalR.HubConnectionBuilder()
.withUrl("http://localhost:13989/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.configureLogging(signalR.LogLevel.Information)
.build();
this.connection.on("ReceiveMessage", function(user, message) {
thisVue.messages.push({ user, message });
console.log({ user, message });
});
this.connection.start();
}

给按钮来个点击事件

 methods: {
//给全部发送消息
sendAll: function() {
this.connection
.invoke("SendMessage", this.user, this.message)
.catch(function(err) {
return console.error(err);
});
}
}

。把代码跑起来,npm run serve........

等一下,先把我们的后端跑起来,要不然是接受不到的。

测试看看先。。

数据拿到了,忘记展示了,先加个<ul>

 <div>
<ul v-for="(item ,index) in messages" v-bind:key="index +'itemMessage'">
<li>{{item.user}} says {{item.message}}</li>
</ul>
</div>

我再加个标题吧好看点。

哎。有内味儿了。

不知道还有人记得之前chahub里面我预留了一个给自己发消息的方法。

嘿,这会儿就给他实现一下,首先我先加个按钮,然后在注册给自己发送的方法。这回我代码就不填出来,先看看效果,之后代码全都给出来。

来了来了,压缩嚣张至极。。。

先把前端代码放出来,完整版

<template>
<div class="home">
<h1>前端演示SignalR</h1>
<input v-model="user" type="text" />
<input v-model="message" type="text" />
<button @click="sendAll">发送全部</button>
<button @click="sendOwn">对自己发送</button>
<div>
<ul v-for="(item ,index) in messages" v-bind:key="index +'itemMessage'">
<li>{{item.user}} says {{item.message}}</li>
</ul>
</div>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from "@/components/HelloWorld.vue";
import * as signalR from "@aspnet/signalr";
export default {
name: "Home",
components: {
HelloWorld
},
data() {
return {
user: "", //用户
message: "", //消息
connection: "", //signalr连接
messages: [] //返回消息
};
},
methods: {
//给全部发送消息
sendAll: function() {
this.connection
.invoke("SendMessage", this.user, this.message)
.catch(function(err) {
return console.error(err);
});
},
//只给自己发送消息
sendOwn: function() {
this.connection
.invoke("SendMessageCaller", this.message)
.catch(function(err) {
return console.error(err);
});
} },
created: function() {
let thisVue = this;
this.connection = new signalR.HubConnectionBuilder()
.withUrl("http://localhost:13989/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.configureLogging(signalR.LogLevel.Information)
.build();
this.connection.on("ReceiveMessage", function(user, message) {
thisVue.messages.push({ user, message });
console.log({ user, message });
});
this.connection.on("ReceiveCaller", function(message) {
let user = "自己";//这里为了push不报错,我就弄了一个默认值。
thisVue.messages.push({ user, message });
console.log({ user, message });
});
this.connection.start();
}
};
</script>

完结!!!

这个其实还是不是特别我完整,下次有时间把中心服务到客户端的也搞出来大伙看看。

中心往外部发送

vue +signalR的更多相关文章

  1. vue +signalR 实现服务端到客户端消息发送

    承接上一篇 上一篇博客实现是了消息的实时通信,这一篇博客主要讲如何从中心服务内部向客户端发送消息. 先看下最终效果: 在core应用程序里加一个控制器TestController 注入控制器中的IHu ...

  2. Asp.Net Core SignalR 系列博客

    系列 SignalR+Vue SignalR+Vue 服务端向客户端发送信息 SignalR+Vue+Log4net 实时日志推送 待定...... 源码地址:https://github.com/Q ...

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

    最近业务中需要实现服务器端与客户端的实时通信功能,对Signalr做了一点总结和整理. SignalR 作为  ASP.NET 的一个库,能够简单方便地为应用提供实时的服务器端与客户端双向通信功能. ...

  4. 轻松搞定Vue 使用SignalR与Asp.net Core通讯

    前言 针对于Web与其他应用的的通讯,在.Net中,SignalR是一个不错的选择,在前后端没有分离的时候,直接引用对应的signalr.js文件即可: 这里主要记录Vue与Asp.netcore 前 ...

  5. Signalr Vue Echarts绘制实时CPU使用率

    后端基于Asp.net webapi,前端Vue,前后端分离,该demo仅做演示,实现的细节可以自己优化 Echarts:4.2.1  可参考 官网 Jquery:3.4.1 Signalr:2.4. ...

  6. .Net core 3.0 SignalR+Vue 实现简单的即时通讯/聊天IM (无jq依赖)

    .Net core 中的SignalR JavaScript客户端已经不需要依赖Jquery了 一.服务端 1.nuget安装 Microsoft.AspNetCore.SignalR 2.在star ...

  7. Asp.net Core3.1+Vue 使用SignalR推送数据

    本文就简单使用 往前端页面推送消息 SignalR 是什么 SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Serv ...

  8. 使用ASP.NET SignalR实现一个简单的聊天室

    前言 距离我写上一篇博客已经又过了一年半载了,时间过得很快,一眨眼,就把人变得沧桑了许多.青春是短暂的,知识是无限的.要用短暂的青春,去学无穷无尽的知识,及时当勉励,岁月不待人.今天写个随笔小结记录一 ...

  9. 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式

    连表查询都用Left Join吧   最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...

随机推荐

  1. openstack nova 创建虚机流程

    1文件 nova.api.openstack.coumpute.servers1函数 def create(self, req, body):1调用 (instances, resv_id) = se ...

  2. 什么是RPC,RPC好处,常用的RPC框架

    RPC简介 RPC(Remote Procedure Call Protocol)远程过程调用协议.一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用 ...

  3. [转]camera教程

    camera教程 Lens一般由几片透镜组成透镜结构,按材质可分为塑胶透镜(plastic)或玻璃透镜(glass),玻璃镜片比树脂镜片贵.塑胶透镜其实是树脂镜片,透光率和感光性等光学指标比不上镀膜镜 ...

  4. 从一个小需求感受Redis的独特魅力

    分享一个简单的小需求应该怎么设计实现以及有关Redis的使用 Redis在实际应用中使用的非常广泛,本篇文章就从一个简单的需求说起,为你讲述一个需求是如何从头到尾开始做的,又是如何一步步完善的. 需求 ...

  5. Shell编程—图形化脚本

    1创建文本菜单 1.1普通的文本菜单 $ cat menu1 #!/bin/bash # simple script menu function diskspace { clear df -k } f ...

  6. [ASP.NET Core开发实战]开篇词

    前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...

  7. Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题. 当你在用list ...

  8. 使用DataStax Java驱动程序的最佳实践

    引言 如果您想开始建立自己的基于Cassandra的Java程序,欢迎! 也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的 ...

  9. 【平台开发】— 4.mysql建库建表

    本想着把前端脚手架run起来了,然后就可以借着登录来捋一下前后端交互的过程.但是后端导入JPA的时候就发现了,还没有数据库. 既然是本着学习的目的,那咱也不想只在后端写死返回的数据,要做就做全套. 一 ...

  10. Codeforces1365

    AC代码 A. Matrix Game 对于给定矩阵,剩余可用的位置的数目是确定的,根据奇偶性判断就完事了. B. Trouble Sort 如果数组\(b\)有0有1,那么Yes.否则只有数组\(a ...