ASP.NET Core SingleR:初次体验和简单项目搭建

news2024/11/28 6:45:09

文章目录

  • 前言
  • 应用场景
  • SignalR 网站长什么样?
  • 第一个ASP.NET core SignalR程序
    • 确定SignalR版本
    • 新建MVC项目
    • 添加unpkg管理器
    • 添加客户端
    • 添加ChatHub文件
    • 添加SignalR服务
    • 添加网页
    • 运行测试
    • 浏览器Websocket调试
      • type=1
      • type=6
      • Type为其它时
  • 总结

前言

平常的网页通讯都是基于Http 请求的,特点就是每次请求之后都会关闭,延迟会比较大。如果想做网页游戏,网页聊天等功能,就要用到即时通信。SignalR 就是一种即时通讯的方式。

微软官方|ASP.NET Core SignalR 概述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

应用场景

我们一般的网络请求都是数据先进数据库,再用网页请求把数据读出来的。

硬件设备
上位机采集程序
数据库
后端
Http网络请求
网页

但是对于低延迟,实时性要求的话,就不符合这个逻辑了。因为实时性的话就说明以前的数据不重要,可以丢弃。就跟直播一样,除非人为地去录播,不然前1分钟的视频画面是没人看的,可以直接丢弃的。

硬件设备
上位机采集程序
'直播'数据流
网页

这里的直播的意思是实时性的数据,不是斗鱼直播这种视频流的意思。

SignalR 网站长什么样?

Blazor就是用SignalR开发的

ASP.NET Core Blazor 托管模型

在这里插入图片描述
我们找一个Blazor的网址看一下

Bootstrap 风格的 Blazor UI 组件库

在这里插入图片描述

第一个ASP.NET core SignalR程序

确定SignalR版本

微软官方有两个SignalR,一个是基于.net Framework的,一个是基于.NET Core。按照微软的意思,应该是建议我们用core SignalR版本

在这里插入图片描述

我在网上找了很多的教程,要么就是版本太老,要么就是答非所问。还是照着微软的教程走一遍看看好了。我顺便找了半天找到了微软最新的.net core 8.0的教程

微软官方文档|教程:ASP.NET Core SignalR 入门

在这里插入图片描述

新建MVC项目

按照微软的意思,开个ASP.NET Core Web,而不是Blazor程序

在这里插入图片描述
在这里插入图片描述

添加unpkg管理器

在这里插入图片描述

网上搜了半天,发现要安装一下LibMan

将 LibMan CLI 与 ASP.NET Core 结合使用

dotnet tool install -g Microsoft.Web.LibraryManager.Cli

这个需要连接外网,在内网可能会报错
在这里插入图片描述

安装成功
在这里插入图片描述

运行一下查看版本,看看是否安装成功

libman --version

在这里插入图片描述

添加客户端

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

添加ChatHub文件

在这里插入图片描述

using Microsoft.AspNetCore.SignalR;

namespace SiganlRTest.Hubs
{
    public class ChatHub : Hub
    {
        public async Task SendMessage(string user, string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
    }
}


添加SignalR服务

在这里插入图片描述

添加网页

@page
<div class="container">
    <div class="row p-1">
        <div class="col-1">User</div>
        <div class="col-5"><input type="text" id="userInput" /></div>
    </div>
    <div class="row p-1">
        <div class="col-1">Message</div>
        <div class="col-5"><input type="text" class="w-100" id="messageInput" /></div>
    </div>
    <div class="row p-1">
        <div class="col-6 text-end">
            <input type="button" id="sendButton" value="Send Message" />
        </div>
    </div>
    <div class="row p-1">
        <div class="col-6">
            <hr />
        </div>
    </div>
    <div class="row p-1">
        <div class="col-6">
            <ul id="messagesList"></ul>
        </div>
    </div>
</div>
<script src="~/js/signalr/dist/browser/signalr.js"></script>
<script src="~/js/chat.js"></script>

在这里插入图片描述
在这里插入图片描述
把微软的代码复制进去

"use strict";

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

//Disable the send button until connection is established.
document.getElementById("sendButton").disabled = true;

connection.on("ReceiveMessage", function (user, message) {
    var li = document.createElement("li");
    document.getElementById("messagesList").appendChild(li);
    // We can assign user-supplied strings to an element's textContent because it
    // is not interpreted as markup. If you're assigning in any other way, you 
    // should be aware of possible script injection concerns.
    li.textContent = `${user} says ${message}`;
});

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();
});

运行测试

在这里插入图片描述

浏览器Websocket调试

在这里插入图片描述
在这里插入图片描述
发送的消息
在这里插入图片描述
收到的消息
在这里插入图片描述
我们看到报文有很多的信息,那么到底是什么意思呢?这里就得去看SignalR的官方Github库了

SignalR Hub Protocol

type=1

在这里插入图片描述

简单翻译一下

  • type:为1的时候,是用来消息交互的。不唯一可能是用来确保网络是否稳定
  • invocationId:可选的,用来区分消息的ID
  • target:触发字符串,类似于MQTT里的Token
  • arguments:消息负载,类似于MQTT里的Payload
  • streamIds:可选的,通讯的唯一ID

type=6

type为6的时候,是用来Ping网络情况的

在这里插入图片描述

Type为其它时

type一共有1-9,9种方式,我这里就不展开说明了

总结

接下来我会去研究一下ASP.NET Core的客户端和服务端开发。网上的资料不是很多,只能自己研究一下了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拷贝 hugging face 仓库到 colab

# 挂在谷歌云硬盘 from google.colab import drive drive.mount(/content/drive) # 转到文件夹 import os os.chdir(/content/drive/MyDrive/) !pwd# 安装并引入包 !pip install gradio bypy huggingface_hub import os import shutil from huggingface_hub import snapshot_do…

PuTTY的ppk密钥与OpenSSH密钥之间的相互转换

几个概念说明&#xff1a;id_rsa、id_rsa.pub、ppk、pem 目前有两个主流的密钥格式&#xff1a;OpenSSH格式的密钥 和 PuTTY格式的密钥。 id_rsa和id_rsa.pub 都是OpenSSH格式的密钥。 id_rsa是OpenSSH格式的SSH私钥。 id_rsa.pub是OpenSSH格式的SSH公钥。ppk文件 ppk文件是P…

【Docker】安装 Nginx 容器并部署前后端分离项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

OpenHarmony 应用开发入门 (一、环境搭建及第一个Hello World)

万事开头难。难在迈出第一步。心无旁骛&#xff0c;万事可破。没有人一开始就能想清楚&#xff0c;只有做起来&#xff0c;目标才会越来越清晰。--马克.扎克伯格 前言 2024年1月16日&#xff0c;华为目前开启已HarmonyOS NEXT开发者预览版Beta招募&#xff0c;报名周期为1月15…

【MATLAB】SVMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 SVMD-LSTM神经网络时序预测算法是一种结合了单变量经验模态分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09…

Three.js 学习笔记之模型(学习中1.17更新)

文章目录 模型 几何体 材质模型点模型Points - 用于显示点线模型Line | LineLoop | LineSegments网格模型mesh - 三角形 几何体BufferGeometry缓冲类型几何体BufferGeometry - 没有任何形状的空几何体创建几何体的方式BufferAttribute Types定义顶点法线 geometry.attributes…

感觉捡到宝了!这究竟是哪位大神出的神器?

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

Java--业务场景:在Spring项目启动时加载Java枚举类到Redis中

文章目录 前言实现项目启动时加载枚举值到Redis1. 定义EnumInterface接口2. 创建EnumDTO3. 创建ClassUtils工具类4. 创建EnumService接口5. 创建EnumServiceImpl6. 修改枚举类7. 创建ApplicationInit 测试结果 前言 新的一年即将来到&#xff0c;回首2023年&#xff0c;也是学…

GEE中Landsat、Sentinel、Modis主要数据集区别

一、Landsat 1. Collection 1/2 的区别 Collection 2 是Landsat Level 1 数据的又一次重大再处理&#xff0c;显著提高了绝对地理定位精度。 Collection1Collection2时间跨度1972~2021底1972~至今数据等级level 1level1&#xff1a;1972~2021底 level2&#xff1a;1982~至今 …

MyBatisPlus学习笔记四-扩展功能

1、代码生成器 1.1、官方的1 1.3、官方的2-idea插件 1.3、非官方的-idea插件 2、静态工具 先查询&#xff0c;再分组 3、逻辑删除 4、枚举处理器 5、JSON处理器

ELK之Filebeat安装配置及日志抓取

一、Filebeat是什么 轻量型日志采集器 无论您是从安全设备、云、容器、主机还是 OT 进行数据收集,Filebeat 都将为您提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情不再繁杂。 Filebeat 随附可观测性和安全数据源模块,这些模块简化了常见格式的日志的收集、解…

Nsis打包Unity Exe文件(通用)

Nsi 脚本 !include "MUI2.nsh"#使用现代UI Unicode true #使用Unicode !define EXENAME "exeName" #定义常量 exe名称 !define SHORTCUT "快捷方式名称" #定义桌面快捷方式的中文名称Name ${EXENAME} #安装程序的title OutFile "${EXENAME…

银行数据仓库体系实践(1)--银行数据仓库简介

银行数据仓库简介 数据仓库之父比尔&#xff08;Bill Inmon&#xff09;在1991年出版的“Building the Data Warehouse”&#xff08;《建立数据仓库》&#xff09;一书中所提出的定义被广泛接受&#xff1a;数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的&a…

如何使用Entity Framework查询Mysql数据库 并实现多表联查

简介 &#x1f340;通过依赖注入的方式&#xff0c;使用ORM工具Entity Framework查询Mysql数据库中的数据&#xff0c;并实现多表联查 假设我们有一个user用户表&#xff0c;其中occupationid对应的就是下面职业表中的id 职业表Occupations 现在我们需要查出用户的职业是什么…

隐秘而精湛:反射物镜用于激光烧蚀质谱系统

激光烧蚀电感耦合等离子体质谱技术 激光烧蚀电感耦合等离子体质谱 &#xff08;LA-ICP-MS&#xff09; 因其灵敏度和概念简单性而被认为是固体材料成分分析最通用的方法之一。自 1985 年 A. Gray 进行首次可行性研究以来&#xff0c;在仪器进步和智能调谐和校准策略概念的推动…

【IDEA相关问题】全局搜索快捷键ctrl+shift+f与win10输入法简繁体切换冲突

解决方案如下&#xff1a; 1. 打开Windows设置&#xff0c;选择【时间和语言】&#xff0c;接着选择【语言】 2. 选择中文&#xff08;简体&#xff0c;中国&#xff09;——【选项】 3. 找到【微软拼音】——【选项】 4. 选择【按键】进入下一步设置界面 5. 在按键设置里即可…

Github 2024-01-16 Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-16统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10HTML项目1 精心策划的Python资源列表 创建周期&#xff1a;3490 天开发语言&#xff1a;Python…

【LabVIEW FPGA入门】FPGA中的数学运算

数值控件选板上的大部分数学函数都支持整数或定点数据类型&#xff0c;但是需要请注意&#xff0c;避免使用乘法、除法、倒数、平方根等函数&#xff0c;此类函数比较占用FPGA资源&#xff0c;且如果使用的是定点数据或单精度浮点数据仅适用于FPGA终端。 1.整数运算 支持的数…

性能测试jmeter

参考up主 啥时当叫兽的个人空间-啥时当叫兽个人主页-哔哩哔哩视频 IMBA_RAILGUN的个人空间-IMBA_RAILGUN个人主页-哔哩哔哩视频 大丫头胖的个人空间-大丫头胖个人主页-哔哩哔哩视频 选的这些怎么添加 在一个列表里面 方法调用${__time(YMD)} 两个下划线&#xff0c;后跟函数…

Cpp多线程(一)

一、基本概念 1、程序是一段静态代码&#xff1b;进程是正在运行的程序&#xff1b;线程则是程序内部的执行路径。 上面这张图就解释了线程和多线程的意义。 2、若一个程序在同一时间执行多个线程&#xff0c;便是支持多线程的。一个进程中的多个线程共享相同的内存单元/内存…