承接上一篇

上一篇博客实现是了消息的实时通信,这一篇博客主要讲如何从中心服务内部向客户端发送消息。

先看下最终效果:

在core应用程序里加一个控制器TestController

注入控制器中的IHubContext实例,并且添加方法

  1. [Route("api/[controller]/[action]")]
  2. [ApiController]
  3. public class TestController : ControllerBase
  4. {
  5. private readonly IHubContext<ChatHub> _hubContext;
  6. public TestController(IHubContext<ChatHub> hubContext)
  7. {
  8. _hubContext = hubContext;
  9. }
  10. [HttpGet]
  11. public async Task<int> Get()
  12. {
  13. await _hubContext.Clients.All.SendAsync("ReceiveMessage", "系统通知", $"北京时间{DateTime.Now}");
  14. return 0;
  15. }
  16. }

然后启用路由和控制器

  1. //启用控制器
  2. services.AddControllers();
  1. app.UseEndpoints(endpoints =>
  2. {
  3. //终结点设置路由默认
  4. endpoints.MapControllerRoute(
  5. name: "default",
  6. pattern: "{controller=Home}/{action=Index}/{id?}");
  7. endpoints.MapRazorPages();
  8. endpoints.MapHub<ChatHub>("/chathub");
  9. });

哎呀忘记配置跨域了

  1. //配置跨域
  2. services.AddCors(c =>
  3. c.AddPolicy("AllowAll", p =>
  4. {
  5. p.AllowAnyOrigin();
  6. p.AllowAnyMethod();
  7. p.AllowAnyHeader();
  8. })
  9. );
  1. //配置跨域别把中间件的位置放错了哦
  2. app.UseCors("AllowAll");

这里为啥要配置跨域呢,因为之前signalr的连接时连接客户端的,它们基于底层的通信协议(这太高深了 ,俺也不懂),而现在我们通过浏览器发送请求获取系统通知的话,就会存在跨域的情况,所以需要配置

因为现在需要发送请求,所以我安装个axios

  1. npm install axios

然后在mian.js配置下。

  1. import axios from 'axios'
  2. Vue.prototype.$http = axios

更新一下上次写的home.vue里的代码

  1. <template>
  2. <div class="home">
  3. <h1>前端演示SignalR</h1>
  4. <input v-model="user" type="text" />
  5. <input v-model="message" type="text" />
  6. <button @click="sendAll">发送全部</button>
  7. <button @click="sendOwn">对自己发送</button>
  8. <button @click="sendClient">系统发送消息</button>
  9.  
  10. <div>
  11. <ul v-for="(item ,index) in messages" v-bind:key="index +'itemMessage'">
  12. <li>{{item.user}} says {{item.message}}</li>
  13. </ul>
  14. </div>
  15. </div>
  16. </template>
  17.  
  18. <script>
  19. // @ is an alias to /src
  20. import HelloWorld from "@/components/HelloWorld.vue";
  21. import * as signalR from "@aspnet/signalr";
  22. export default {
  23. name: "Home",
  24. components: {
  25. HelloWorld
  26. },
  27. data() {
  28. return {
  29. user: "", //用户
  30. message: "", //消息
  31. connection: "", //signalr连接
  32. messages: [] //返回消息
  33. };
  34. },
  35. methods: {
  36. //给全部发送消息
  37. sendAll: function() {
  38. this.connection
  39. .invoke("SendMessage", this.user, this.message)
  40. .catch(function(err) {
  41. return console.error(err);
  42. });
  43. },
  44. //只给自己发送消息
  45. sendOwn: function() {
  46. this.connection
  47. .invoke("SendMessageCaller", this.message)
  48. .catch(function(err) {
  49. return console.error(err);
  50. });
  51. },
  52. //系统发送消息
  53. sendClient: function() {
  54. this.$http.get("http://localhost:13989/api/test/get").then(resp => {
  55. console.log(resp);
  56. });
  57. }
  58. },
  59. created: function() {
  60. let thisVue = this;
  61. this.connection = new signalR.HubConnectionBuilder()
  62. .withUrl("http://localhost:13989/chathub", {
  63. skipNegotiation: true,
  64. transport: signalR.HttpTransportType.WebSockets
  65. })
  66. .configureLogging(signalR.LogLevel.Information)
  67. .build();
  68. this.connection.on("ReceiveMessage", function(user, message) {
  69. thisVue.messages.push({ user, message });
  70. console.log({ user, message });
  71. });
  72. this.connection.on("ReceiveCaller", function(message) {
  73. let user = "自己"; //这里为了push不报错,我就弄了一个默认值。
  74. thisVue.messages.push({ user, message });
  75. console.log({ user, message });
  76. });
  77. this.connection.start();
  78. }
  79. };
  80. </script>

这样的话,就能开篇那个效果了。

这里说几个注意的点,添加控制器之后一定要启用他,还有路由也要配置,否则你用postman的也是请求不到的,然后就是跨域配置,这些都是实现这个功能不能缺少的配置。

源码地址:https://github.com/QQ2287991080/SignalRServerAndVueClientDemo

vue +signalR 实现服务端到客户端消息发送的更多相关文章

  1. 基于SignalR的服务端和客户端通讯处理

    SignalR是一个.NET Core/.NET Framework的实时通讯的框架,一般应用在ASP.NET上,当然也可以应用在Winform上实现服务端和客户端的消息通讯,本篇随笔主要基于Sign ...

  2. 使用WebSocket实现服务端和客户端的通信

    开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...

  3. Asp.net SignalR 实现服务端消息推送到Web端

              之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我 ...

  4. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  5. netty-2.客户端与服务端互发消息

    (原) 第二篇,客户端与服务端互发消息 与第一篇的例子类似,这里服务端需要三个类,客户端也需要三个类. 服务端关键代码如下:MyServer与上一个例子中的TestServer 差多,这里只列举不同的 ...

  6. java Socket通信,客户端与服务端相互发消息

    1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...

  7. Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

    假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...

  8. 【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示

    前言: MQTT广泛应用于工业物联网.智能家居.各类智能制造或各类自动化场景等.MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信.机器与物联网通信等. ...

  9. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

随机推荐

  1. JS 对象基本用法

    声明对象的两种语法 let obj = { 'name': 'frank', 'age': 18 } let obj = new Object({'name': 'frank'}) 如何删除对象的属性 ...

  2. 牛客网PAT练习场-数素数

    题解:就是一道素数筛选法 题目地址:https://www.nowcoder.com/questionTerminal/e0fb49acb75f47e8b6fa2077d9071799 /** * C ...

  3. 《HelloGitHub》第 53 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  4. GeneralUpdate2.1.0发布

    GeneralUpdate GeneralUpdate是基于.net framwork开发的一款(c/s应用)自动升级程序.该组件将更新的核心部分抽离出来方便应用于多种项目当中目前适用于wpf,控制台 ...

  5. 基于.NetCore3.1系列 —— 日志记录之初识Serilog

    一.前言 对内置日志系统的整体实现进行了介绍之后,可以通过使用内置记录器来实现日志的输出路径.而在实际项目开发中,使用第三方日志框架(如: Log4Net.NLog.Loggr.Serilog.Sen ...

  6. HMM隐马尔可夫模型来龙去脉(二)

    目录 前言 预备知识 一.估计问题 1.问题推导 2.前向算法/后向算法 二.序列问题 1.问题推导 2.维特比算法 三.参数估计问题 1.问题推导 2.期望最大化算法(前向后向算法) 总结 前言 H ...

  7. [ASP.NET Core开发实战]基础篇01 Startup

    Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...

  8. C#转PHP

    官方主页 https://github.com/isukces/cs2php 快速开始 http://www.cs2php.com/how-to-begin.htm#.W2rBhC2B3mI 如何在V ...

  9. WinForm使用Setuo Project打包安装包 (附带vs2019 InstallerProjects安装程序)

    vs2019 InstallerProjects安装程序地址: 链接:https://pan.baidu.com/s/1K5iDuQT4CBBw2dJjRLqhjg提取码:dfhy 转载至https: ...

  10. [Java数据结构]使用Stack检查表达式中左右括号是否匹配

    Stack是一种先进后出的数据结构后,这个特点决定了它在递归向下的场景中有独到的功效. 以下程序展示了它在检查表达式中括号匹配的有效性: 程序: package com.heyang.util; im ...