Blazor学习之旅(11)简易SignalR聊天室
大家好,我是Edison。
很久没有更新Blazor这个系列了,在上一篇我们学习了如何实现多语言和本地化,这一篇我们了解下Blazor+SignalR结合。
什么是SignalR?
ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加实时 Web 功能。实时 Web 功能使服务器端代码能够将内容推送到客户端。适合 SignalR 的候选项:
- 需要从服务器进行高频率更新的应用。示例包括游戏、社交网络、投票、拍卖、地图和 GPS 应用。
- 仪表板和监视应用。示例包括公司仪表板、即时销售更新或旅行警报。
- 协作应用。协作应用的示例包括白板应用和团队会议软件。
- 需要通知的应用。社交网络、电子邮件、聊天、游戏、旅行警报和很多其他应用都需使用通知。
接下来,我就以一个简易的SignalR实现的聊天室为例,介绍如何通过结合Blazor+SignalR来做一个超快速实现的实时应用。
在Blazor中实现本地化的步骤
(1)准备工作
假设我们已经有了一个Blazor Server应用程序,你可以从这里获取Code:https://github.com/Coder-EdisonZhou/BlazorSamples。
(2)添加SignalR客户端
在项目的Nuget管理器中搜索并安装:Microsoft.AspNetCore.SignalR.Client。

这里选择的是6.0.20版本,你需要选择与你的应用框架匹配的版本。
(3)添加SignalR Hub(集线器)
添加一个Hubs目录,在该目录下可以存放我们自定义的多个SignalR Hub。这里我们添加一个 MyChatHub,其代码如下:
using Microsoft.AspNetCore.SignalR; namespace EDT.BlazorServer.App.Hubs;
public class MyChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
(4)为SignalR添加必要服务
为了SignalR的正常使用,我们需要在Program.cs中做一些必要服务的添加,比如响应压缩中间件(ResponseCompression) 和 EndPoint。
......
using Microsoft.AspNetCore.ResponseCompression;
using EDT.BlazorServer.App.Hubs;
// Add Response Compression for SignalR
builder.Services.AddResponseCompression(opts =>
{
opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/octet-stream" });
});
......
app.MapBlazorHub();
app.MapHub<MyChatHub>("/mychathub"); // Add Map for SignalR Hubs
app.UseResponseCompression(); // Use Response Compression for SignalR
......
(5)创建聊天室Razor组件页面
在Pages目录下新建一个Razor组件,暂且命名为 ChatRoom.razor。
@page "/chatroom"
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager Navigation
@implements IAsyncDisposable <PageTitle>My ChatRoom</PageTitle> <div class="form-group">
<label>
User:
<input @bind="userInput" />
</label>
</div>
<div class="form-group">
<label>
Message:
<input @bind="messageInput" size="50" @onkeypress="Enter" />
</label>
</div>
<button @onclick="Send" disabled="@(!IsConnected)">Send</button> <hr> <ul id="messagesList">
@foreach (var message in messages)
{
<li>@message</li>
}
</ul> @code {
private HubConnection? hubConnection;
private List<string> messages = new List<string>();
private string? userInput;
private string? messageInput; protected override async Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/mychathub"))
.Build(); hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
{
var encodedMsg = $"{user}: {message}";
messages.Add(encodedMsg);
InvokeAsync(StateHasChanged);
}); await hubConnection.StartAsync();
} private async Task Send()
{
if (hubConnection is not null)
{
await hubConnection.SendAsync("SendMessage", userInput, messageInput);
}
} private async Task Enter(KeyboardEventArgs e)
{
if (e.Code == "Enter" || e.Code == "NumpadEnter")
{
await this.Send();
}
} public bool IsConnected =>
hubConnection?.State == HubConnectionState.Connected; public async ValueTask DisposeAsync()
{
if (hubConnection is not null)
{
await hubConnection.DisposeAsync();
}
}
}
(6)效果演示
如下图所示,用浏览器打开两个ChatRoom,输入用户名和消息点击Send按钮,既可有一个实时聊天室的效果:

小结
本篇,我们在Blazor中结合SignalR实现了一个超简单的聊天室效果,虽然只是一个很简单的聊天室,但却可以通过SignalR这种方式快速的实现类似的实时应用。
参考代码
GitHub:https://github.com/EdisonChou/BlazorSamples/tree/main
参考资料
Microsoft Learning,《结合使用ASP.NET Core SignalR 和 Blazor》

Blazor学习之旅(11)简易SignalR聊天室的更多相关文章
- SignalR 聊天室实例详解(服务器端推送版)
翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room (在这里可以下载到实例的源码) Asp.Net Si ...
- SignalR学习笔记(一) 简单聊天室
什么是ASP.NET SignalR? ASP.NET SignalR是一个方便程序员添加实时网络通信功能的类库.所谓的实时网络通信功能(Real-time Web Functionality)就是需 ...
- [XMPP]简易的聊天室实现[二](使用CocoaAsyncSocket)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- C 基于UDP实现一个简易的聊天室
引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...
- redis实现简易在线聊天室
redis_flask简易聊天室 项目构建 这时一个基于Redis数据库的简单小项目,使用redis缓存数据,并通过flask部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...
- golang简易版聊天室
功能需求: 创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊 效果图: 群聊: 单聊: 服务端: package main import ( "fmt" ...
- 笔记-JavaWeb学习之旅11
请求转发:一种在服务器内部的资源跳转方式 使用步骤 1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path) ...
- c# signalr聊天室开源资料
SignalR+LayIM源码: http://www.cnblogs.com/panzi/p/5742089.html 钉钉客户端源码: http://www.cnblogs.com/loveson ...
- [XMPP]简易的聊天室实现[一]
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- .net SignalR 聊天室
代码地址:https://gitee.com/srnsrn/netSignalr.git 运行项目打开多个页面 私密聊天
随机推荐
- ANSYS 部件组装的注意事项
ANSYS 中部件的装配 ANSYS 也可以实现与 Abaqus 类似的组装功能,但是要注意装配过程中材料编号,单元编号,坐标系编号的变化 具体装配流程 1.组件的创建和保存 ! 1.组件开头设置 f ...
- 【C语言】从源代码编译成可执行文件的步骤
零.流程图 flowchat st=>start: 开始 e=>end: 结束 op1=>operation: 编写源代码".c"文件 #include<s ...
- IntelliJ IDEA 社区版没有 Spring Initializr
RT 解决办法 打开文件 - 设置 - 插件 输入 Spring 找到插件 Spring Assistant 并安装 下载可能会需要一点点时间. 重启 IDEA 后,新建项目就可以看见 Spring ...
- go: no such tool "compile"(记录)
这是一次离谱问题和胡搞一通莫名解决的记录 背景:win11系统下,原有的go1.18更新到go1.19后出现了莫名的go: no sucn tool "compile"的情况. 当 ...
- Mybatis的*Dao.XML中的配置与其对应的接口、resultMap的运用
例子. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC &quo ...
- 一条 SQL 语句在 MySQL 中的执行过程
一条 SQL 语句在 MySQL 中的执行过程 当一条 SQL 语句被提交到 MySQL 时,它会经历多个步骤,包括解析.优化.执行等.以下以 SELECT 语句为例,详细描述整个执行流程. 1. 客 ...
- Issue: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
问题: Fatal error compiling: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImpor ...
- Go 切片的扩容规则是怎么样的
切片是动态数组,容量是根据元素动态增加的. 本来想看看源码怎么写的,发现切片追加元素的方法是内置的,看起来还挺麻烦 源码位于 builtin.go 中: // The append built-in ...
- PHP中的精确计算bcadd,bcsub,bcmul,bcdiv 及 扩展安装
<?php/** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */function math ...
- sonarqube+gitlab+jenkins+maven集成搭建 (五)
Jenkins与SonarQube Jenkins 配置 SonarQube在 SonarQube 中生成 Server authentication token登录 SonarQube 后,在 &q ...