结合使用 ASP.NET Core SignalR 和 Blazor WebAssemblyUse ASP.NET Core SignalR with Blazor WebAssembly

本文内容

作者:Daniel RothLuke Latham

重要

Blazor WebAssembly 为预览版状态

ASP.NET Core 3.0 支持 Blazor Server。Blazor WebAssembly 在 ASP.NET Core 3.1 中为预览版。

本教程介绍使用 SignalR 和 Blazor WebAssembly 生成实时应用的基础知识。您将学习如何:

  • 创建 Blazor WebAssembly 托管应用项目
  • 添加 SignalR 客户端库
  • 添加 SignalR 集线器
  • 添加 SignalR 服务和 SignalR 集线器的终结点
  • 添加用于聊天的 Razor 组件代码

在本教程结束时,你将拥有一个正常运行的聊天应用。

查看或下载示例代码如何下载

先决条件Prerequisites

Visual Studio Code 说明使用用于 ASP.NET Core 的 .NET Core CLI 开发功能,如项目创建。可在任何平台(macOS、Linux 或 Windows)上或在任何代码编辑器中遵循这些说明。如果使用 Visual Studio Code 以外的其他内容,则可能需要进行少量更改。

.NET Core 3.1 SDK 或更高版本

创建托管 Blazor WebAssembly 应用项目Create a hosted Blazor WebAssembly app project

安装 Blazor WebAssembly 模板。当 Blazor WebAssembly 处于预览状态时, Microsoft.AspNetCore.Components.WebAssembly.Templates 包具有预览版本。在命令行界面中执行以下命令:

  1. dotnet new -i Microsoft.AspNetCore.Components.WebAssembly.Templates::3.2.0-preview2.20160.5

按照所选工具的指南进行操作:

  • 创建新项目。

  • 选择“Blazor 应用” ,然后选择“下一步” 。

  • 在“项目名称” 字段中键入“BlazorSignalRApp”。确认“位置” 条目正确无误或为项目提供位置。选择“创建” 。

  • 选择“Blazor WebAssembly 应用” 模板。

  • 在“高级” 下选中“托管的 ASP.NET Core” 复选框。

  • 选择“创建” 。

备注

如果升级或安装了新版 Visual Studio,并且 Blazor WebAssembly 模板没有出现在 VS UI 中,请使用前面显示的 dotnet new 命令重新安装该模板。

  • 在命令行界面中执行以下命令:
  1. dotnet new blazorwasm --hosted --output BlazorSignalRApp
  • 在 Visual Studio Code 中打开应用的项目文件夹。

  • 当显示添加资产以生成和调试应用的对话框时,选择“是” 。Visual Studio Code 会自动添加“.vscode” 文件夹以及生成的“launch.json” 和“tasks.json” 文件。

  • 在命令行界面中执行以下命令:
  1. dotnet new blazorwasm --hosted --output BlazorSignalRApp
  • 在 Visual Studio for Mac 中,通过导航到项目文件夹并打开项目的解决方案文件 (.sln ) 打开项目。

在命令行界面中执行以下命令:

  1. dotnet new blazorwasm --hosted --output BlazorSignalRApp

添加 SignalR 客户端库Add the SignalR client library

  • 在“解决方案资源管理器”中,右键单击“BlazorSignalRApp.Client”项目,然后选择“管理 NuGet 包” 。

  • 在“管理 NuGet 包” 对话框中,确认“包源” 设置为“nuget.org” 。

  • 选择“浏览” 后,在搜索框中键入“Microsoft.AspNetCore.SignalR.Client”。

  • 在搜索结果中,选中 Microsoft.AspNetCore.SignalR.Client 包,然后选择“安装” 。

  • 如果出现“预览更改” 对话框,则选择“确定” 。

  • 如果出现“许可证接受” 对话框,如果你同意许可条款,请选择“我接受” 。

在“集成终端” (工具栏上的“视图” > “终端” )中,执行以下命令:

  1. dotnet add Client package Microsoft.AspNetCore.SignalR.Client
  • 在“解决方案” 边栏中,右键单击“BlazorSignalRApp.Client” 项目,然后选择“管理 NuGet 包” 。

  • 在“管理 NuGet 包” 对话框中,确认源下拉列表设置为“nuget.org” 。

  • 选择“浏览” 后,在搜索框中键入“Microsoft.AspNetCore.SignalR.Client”。

  • 在搜索结果中,选中 Microsoft.AspNetCore.SignalR.Client 包旁边的复选框,然后选择“添加包” 。

  • 出现“许可证接受” 对话框时,如果你同意许可条款,请选择“接受” 。

在命令行界面中执行以下命令:

  1. cd BlazorSignalRApp
  2. dotnet add Client package Microsoft.AspNetCore.SignalR.Client

添加 SignalR 集线器Add a SignalR hub

在“BlazorSignalRApp.Server” 项目中,创建一个“Hubs” (复数)文件夹,并添加以下 ChatHub 类 (Hubs/ChatHub.cs ):

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.SignalR;
  6. namespace BlazorSignalRApp.Server.Hubs
  7. {
  8. public class ChatHub : Hub
  9. {
  10. public async Task SendMessage(string user, string message)
  11. {
  12. await Clients.All.SendAsync("ReceiveMessage", user, message);
  13. }
  14. }
  15. }

添加 SignalR 服务和 SignalR 集线器的终结点Add SignalR services and an endpoint for the SignalR hub

  • 在“BlazorSignalRApp.Server” 项目中,打开“Startup.cs” 文件。

  • ChatHub 类的命名空间添加到文件顶部:

  1. using BlazorSignalRApp.Server.Hubs;
  • 将 SignalR 服务添加到 Startup.ConfigureServices
  1. services.AddSignalR();
  • 在默认控制器路由的终结点与客户端回退的终结点之间的 Startup.Configure 中,为集线器添加终结点:
  1. app.UseEndpoints(endpoints =>
  2. {
  3. endpoints.MapDefaultControllerRoute();
  4. endpoints.MapHub<ChatHub>("/chatHub");
  5. endpoints.MapFallbackToClientSideBlazor<Client.Program>("index.html");
  6. });

添加用于聊天的 Razor 组件代码Add Razor component code for chat

  • 在“BlazorSignalRApp.Client” 项目中,打开“Pages/Index.razor” 文件。

  • 将标记替换为以下代码:

  1. @page "/"
  2. @using Microsoft.AspNetCore.SignalR.Client
  3. @inject NavigationManager NavigationManager
  4. <div class="form-group">
  5. <label>
  6. User:
  7. <input @bind="_userInput" />
  8. </label>
  9. </div>
  10. <div class="form-group">
  11. <label>
  12. Message:
  13. <input @bind="_messageInput" size="50" />
  14. </label>
  15. </div>
  16. <button @onclick="Send" disabled="@(!IsConnected)">Send</button>
  17. <hr>
  18. <ul id="messagesList">
  19. @foreach (var message in _messages)
  20. {
  21. <li>@message</li>
  22. }
  23. </ul>
  24. @code {
  25. private HubConnection _hubConnection;
  26. private List<string> _messages = new List<string>();
  27. private string _userInput;
  28. private string _messageInput;
  29. protected override async Task OnInitializedAsync()
  30. {
  31. _hubConnection = new HubConnectionBuilder()
  32. .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))
  33. .Build();
  34. _hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
  35. {
  36. var encodedMsg = $"{user}: {message}";
  37. _messages.Add(encodedMsg);
  38. StateHasChanged();
  39. });
  40. await _hubConnection.StartAsync();
  41. }
  42. Task Send() =>
  43. _hubConnection.SendAsync("SendMessage", _userInput, _messageInput);
  44. public bool IsConnected =>
  45. _hubConnection.State == HubConnectionState.Connected;
  46. }

运行应用Run the app

  • 按照工具的指南进行操作:
  • 在“解决方案资源管理器” 中,选择“BlazorSignalRApp.Server” 项目。按 Ctrl+F5 可运行应用而不进行调试 。

  • 从地址栏复制 URL,打开另一个浏览器实例或选项卡,并在地址栏中粘贴该 URL。

  • 选择任一浏览器,输入名称和消息,然后选择“发送”按钮 。两个页面上立即显示名称和消息:

SignalR Blazor WebAssembly 示例应用在两个浏览器窗口中打开,显示交换的消息。

Quotes:Star Trek VI:The Undiscovered Country ©1991 Paramount

  • 从工具栏选择“调试” > “运行(不调试)” 。

  • 从地址栏复制 URL,打开另一个浏览器实例或选项卡,并在地址栏中粘贴该 URL。

  • 选择任一浏览器,输入名称和消息,然后选择“发送”按钮 。两个页面上立即显示名称和消息:

SignalR Blazor WebAssembly 示例应用在两个浏览器窗口中打开,显示交换的消息。

Quotes:Star Trek VI:The Undiscovered Country ©1991 Paramount

  • 在“解决方案” 边栏中,选择“BlazorSignalRApp.Server” 项目。从菜单中选择“运行” > “开始执行(不调试)” 。

  • 从地址栏复制 URL,打开另一个浏览器实例或选项卡,并在地址栏中粘贴该 URL。

  • 选择任一浏览器,输入名称和消息,然后选择“发送”按钮 。两个页面上立即显示名称和消息:

SignalR Blazor WebAssembly 示例应用在两个浏览器窗口中打开,显示交换的消息。

Quotes:Star Trek VI:The Undiscovered Country ©1991 Paramount

  • 在命令行界面中执行以下命令:
  1. cd Server
  2. dotnet run
  • 从地址栏复制 URL,打开另一个浏览器实例或选项卡,并在地址栏中粘贴该 URL。

  • 选择任一浏览器,输入名称和消息,然后选择“发送”按钮 。两个页面上立即显示名称和消息:

SignalR Blazor WebAssembly 示例应用在两个浏览器窗口中打开,显示交换的消息。

Quotes:Star Trek VI:The Undiscovered Country ©1991 Paramount

后续步骤Next steps

在本教程中,你将了解:

  • 创建 Blazor WebAssembly 托管应用项目
  • 添加 SignalR 客户端库
  • 添加 SignalR 集线器
  • 添加 SignalR 服务和 SignalR 中心的终结点
  • 添加用于聊天的 Razor 组件代码

若要了解有关生成 Blazor 应用的详细信息,请参阅 Blazor 文档:

ASP.NET Core Blazor 简介

其他资源Additional resources