前言

  今天尝试了一下signalR,感觉还不错,因为暂时用不到,就写一篇博文来记录搭建过程,以免以后给忘了,基于官方文档写的,不过官方没有webapi调用例子,就自己写了一下,大神勿喷

使用

1.创建一个netcore3.1 webapi程序,nuget引用一下Microsoft.AspNetCore.SignalR,我这里是1.1.0版本

2.创建一个类 SignalRHub.cs 用来自定义集线器 继承自SignalR的集线器 代码如下

  1. using Microsoft.AspNetCore.SignalR;
  2. using System;
  3. using System.Threading.Tasks;
  4. namespace SignalR_Server{
  5. public class SignalRHub:Hub {
  6. public async Task sendall(string user, string message)
  7. {
  8. await Clients.All.SendAsync("toall",user,message,"给所有人发");
  9. }
  10. /// <summary>
  11. /// 重写集线器连接事件
  12. /// </summary>
  13. /// <returns></returns>
  14. public override Task OnConnectedAsync()
  15. {
  16. Console.WriteLine($"{Context.ConnectionId}已连接");
  17. return base.OnConnectedAsync();
  18. }
  19. /// <summary>
  20. /// 重写集线器关闭事件
  21. /// </summary>
  22. /// <param name="exception"></param>
  23. /// <returns></returns>
  24. public override Task OnDisconnectedAsync(Exception exception)
  25. {
  26. Console.WriteLine("触发了关闭事件");
  27. return base.OnDisconnectedAsync(exception);
  28. }
  29. }}

3.修改Startup中的ConfigureServices方法 代码如下

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //配置SignalR服务 配置跨域
  4. services.AddCors(options => options.AddPolicy("CorsPolicy",
  5. builder =>
  6. {
  7. builder.AllowAnyMethod()
  8. .AllowAnyHeader()
  9. .WithOrigins("http://localhost:51083")
  10. .AllowCredentials();
  11. }));
  12. services.AddSignalR();
  13. services.AddControllers(); }

4.修改Startup中的Configure方法 代码如下

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. app.UseRouting();
  8. //使用跨域
  9. app.UseCors("CorsPolicy");
  10. app.UseAuthorization();
  11. app.UseEndpoints(endpoints =>
  12. {
  13. endpoints.MapControllers();
  14. //使用集线器
  15. endpoints.MapHub<SignalRHub>("/chatHub");
  16. });
  17. }

5.因为要实现前后端分离 这里我们再打开一个vs 创建一个mvc项目 用来模拟前端

将图片上的这三个文件里面的代码替换成我的 其中signalr.js是官方的 下载方式如下

(1)在“解决方案资源管理器” 中,右键单击项目,然后选择“添加” >“客户端库” 。

(2)在“添加客户端库” 对话框中,对于“提供程序” ,选择“unpkg” 。

(3)对于“库” ,输入 @microsoft/signalr@3,然后选择不是预览版的最新版本

(4)选择“选择特定文件” ,展开“dist/browser” 文件夹,然后选择“signalr.js” 和“signalr.min.js”

(5)将“目标位置” 设置为 wwwroot/js/ ,然后选择“安装”

该方法复制于弱水三千 只取一瓢饮

感谢老哥 大家也可以参考官方文档进行下载

剩下的两个文件代码很简单 我就不多说了

chat.js

  1. "use strict";
  2. var connection = new signalR.HubConnectionBuilder().withUrl("http://localhost:5000/chatHub").build();
  3. //Disable send button until connection is establisheddocument.getElementById("sendButton").disabled = true;
  4. //这个可以不一致
  5. connection.on("toall", function (user, message,test)
  6. {
  7. var msg = message;
  8. var encodedMsg = user + " says " + msg + "\n来源是" + test;
  9. var li = document.createElement("li");
  10. li.textContent = encodedMsg;
  11. document.getElementById("messagesList").appendChild(li);});connection.start().then(function () {
  12. document.getElementById("sendButton").disabled = false;}).catch(function (err) {
  13. return console.error(err.toString());});document.getElementById("sendButton").addEventListener("click", function (event) {
  14. var user = document.getElementById("userInput").value;
  15. var message = document.getElementById("messageInput").value;
  16. //和服务器必须一致
  17. connection.invoke("sendall", user, message).catch(function (err) {
  18. return console.error(err.toString());
  19. });
  20. event.preventDefault();
  21. });

Index.cshtml

  1. @page<div class="container">
  2. <div class="row"> </div>
  3. <div class="row">
  4. <div class="col-2">用户名</div>
  5. <div class="col-4"><input type="text" id="userInput" /></div>
  6. </div>
  7. <div class="row">
  8. <div class="col-2">要发送的消息</div>
  9. <div class="col-4"><input type="text" id="messageInput" /></div>
  10. </div>
  11. <div class="row">
  12. </div>
  13. <div class="row">
  14. <div class="col-6">
  15. <input type="button" id="sendButton" value="发送消息" />
  16. </div>
  17. </div>
  18. </div>
  19. <div class="row">
  20. <div class="col-12">
  21. <hr />
  22. </div>
  23. </div>
  24. <div class="row">
  25. <div class="col-6">
  26. <ul id="messagesList"></ul>
  27. </div>
  28. </div>
  29. <script src="~/js/signalr.js"></script><script src="~/js/chat.js"></script>

然后启动服务端和客户端 注意这里服务端我们使用kestrel的方式启动

启动成功可以看到控制台成功打印出了连接的用户id 测试发消息也正常

6.现在我们要通过api的方式进行请求了 在服务端新建一个控制器SignalRTestController 代码如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices.WindowsRuntime;
  5. using System.Threading.Tasks;
  6. using Ladder.Data;
  7. using Microsoft.AspNetCore.Http;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.AspNetCore.SignalR;
  10. namespace SignalR_Server.Controllers{
  11. [Route("api/[controller]")]
  12. [ApiController]
  13. public class SignalRTestController : ControllerBase {
  14. private readonly IHubContext<SignalRHub> _hubContext;
  15. public SignalRTestController(IHubContext<SignalRHub> hubClients)
  16. {
  17. _hubContext = hubClients;
  18. }
  19. [HttpGet("index")]
  20. public string index()
  21. {
  22. return "HELLO World";
  23. }
  24. [HttpGet("sendall")]
  25. public void SendAll()
  26. {
  27. //给所有人推送消息
  28. _hubContext.Clients.All.SendAsync("toall", "后端","你好","给所有人发");
  29. }
  30. [HttpGet("sendToUser")]
  31. public void SendToUser(string user)
  32. {
  33. //给指定人推送消息
  34. _hubContext.Clients.Client(user).SendAsync("toall", "后端", $"你好{user}", "只给你发");
  35. }
  36. }}

然后启动服务端和客户端 将客户端的页面打开两个

测试一下给指定人发

测试一个给所有人发

ok啦~

netcore3.1 webapi使用signalR的更多相关文章

  1. WebAPI集成SignalR

    WebAPI提供通用数据接口,SignalR提供实时消息传输,两者可以根据实际业务需求进行组合. 环境 版本 操作系统 Windows 10 prefessional 编译器 Visual Studi ...

  2. asp.net core 2.0 webapi集成signalr

    asp.net core 2.0 webapi集成signalr   在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的: 这两天想着不能这么无私,最近.N ...

  3. csc.rsp Nuget MVC/WebAPI、SignalR、Rx、Json、EntityFramework、OAuth、Spatial

    # This file contains command-line options that the C# # command line compiler (CSC) will process as ...

  4. netcore3.0 webapi集成Swagger 5.0

    在项目中引用Swashbuckle.AspNetCore和Swashbuckle.AspNetCore.Filters两个dll,在Startup中的ConfigureServices相关配置代码如下 ...

  5. netCore3.0+webapi到前端vue(前端)

    前篇已经完成后端配置并获取到api连接 https://www.cnblogs.com/ouyangkai/p/11504279.html 前端项目用的是VS code编译器完成 vue 第一步 引入 ...

  6. netCore3.0+webapi到前端vue(后端)

    第一步创建api项目 创建完成启动F5!! 如图 数据库我用的是mysql 用ef操作数据 开发环境:Win10 + VS2019Mysql服务器版本:8.0.16 1.下载并安装插件(必备) MyS ...

  7. netcore3.0 webapi集成Swagger 5.0,Swagger使用

    Swagger使用 1.描述 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 作用: 1.接口的文档在线自动生成. 2.功能测试 本文转自 ...

  8. Asp.NetCore3.1 WebApi 使用Jwt 授权认证使用

    1:导入NuGet包 Microsoft.AspNetCore.Authentication.JwtBearer 2:配置 jwt相关信息 3:在 startUp中 public void Confi ...

  9. Vue学习使用系列九【axiox全局默认配置以及结合Asp.NetCore3.1 WebApi 生成显示Base64的图形验证码】

    1:前端code 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta char ...

随机推荐

  1. 【关系抽取-R-BERT】模型结构

    模型的整体结构 相关代码 import torch import torch.nn as nn from transformers import BertModel, BertPreTrainedMo ...

  2. JVM之调优及常见场景分析

    JVM调优 GC调优是最后要做的工作,GC调优的目的可以总结为下面两点: 减少对象晋升到老年代的数量 减少FullGC的执行时间 通过监控排查问题及验证优化结果,可以分为: 命令监控:jps.jinf ...

  3. python中gzip模块的使用

    gzip模块能够直接压缩和解压缩bytes-like类型的数据,同时也能实现对应格式文件的压缩与解压缩 一.数据压缩与解压缩 压缩 函数-gzip.compress(data, compresslev ...

  4. OpenCV图像处理中的“机器学习"技术的使用

    注意,本文中所指"机器学习"(ML)技术,特指SVM.随机森林等"传统"技术. 一.应用场景        相比较当下发展迅速的各路"端到端" ...

  5. 使用Amazon Pinpoint对用户行为追踪

    1.前言 最近在做一个项目,我们的后台大数据团队需要了解用户在使用app的时候,都进行了哪些操作,在哪个页面都干了些什么,以及app日活和月活等等,各种数据.总之就是监控用户行为,说好听一点就是发送反 ...

  6. 学习笔记-vue.js快捷登录 enter

    一般监听在输入密码的input监听keyup事件,加enter修饰符.如果input是组件,加上.native修饰符.<div id="app"> <input ...

  7. Chapter 2 简单DC-DC变换器稳态分析小结

    Chapter 2 简单DC-DC变换器稳态分析小结 1 本章重点 1.1 小纹波近似 所谓小纹波近似就是DC-DC变换器的稳态分析中,假定开关频率次的纹波相对于直流分量而言非常小,可以将其忽略进行各 ...

  8. SpringCloudAlibaba—微服务概念及SpringCloudAlibaba介绍

    目录 1.1 系统架构演变 1.1.1 单体应用架构 1.1.2垂直应用架构 1.1.3 分布式架构 1.1.4 SOA架构 1.1.5 微服务架构 1.2 微服务架构介绍 1.2.1 微服务架构的常 ...

  9. 201871030109-韩诚 实验一 软件工程准备—Blog

    项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 软件工程准备-Blog 我的课程学习目标 (1)学习博客园软件开发者学习社区使用技巧和经验(2) 掌握软件工程导论这门课程的基础理论知识 ...

  10. Java中获取类的运行时结构

    获取运行时类的完整结构 通过反射获取运行时类的完整结构 Field(属性).Method(方法).Constructor(构造器).Superclass(父类).Interface(接口).Annot ...