.NET 7 SignalR Client Results功能实现报错及相关问题咨询
解决.NET 7 SignalR Client Results功能使用问题
1. 替换弃用的SignalR包
你当前使用的Microsoft.AspNetCore.SignalR 1.1.0是ASP.NET Core早期版本的弃用包,在.NET 7中SignalR已整合到ASP.NET Core框架内,无需单独引用该旧包。请直接移除它,确保项目仅依赖.NET 7 SDK自带的ASP.NET Core组件(项目文件中保留<TargetFramework>net7.0</TargetFramework>即可,无需额外添加SignalR相关NuGet包)。
2. 修正Clients.Single的错误
.NET 7 Preview 4中的Clients.Single方法在正式版中已被调整,正确写法是使用Clients.Client(connectionId)定位单个客户端,结合InvokeAsync实现Client Results功能(服务端调用客户端方法并等待返回结果)。修正后的Hub代码如下:
public class HubTest : Hub { public async override Task OnConnectedAsync() { await Clients.Caller.SendAsync("Connected", $"Your connection ID: {Context.ConnectionId}"); } public async override Task OnDisconnectedAsync(Exception exception) { // 可添加断开连接后的清理逻辑 } public async Task WaitForResult(string connectionId) { var randomValue = Random.Shared.Next(0, 10); // 调用客户端的GetResult方法并等待返回值 var result = await Clients.Client(connectionId).InvokeAsync<int>( "GetResult", "Guess the value between 0 and 10."); if (result == randomValue) { await Clients.Client(connectionId).SendAsync("EndResult", "You guessed correctly!"); } else { await Clients.Client(connectionId).SendAsync("EndResult", $"You guessed incorrectly, value was {randomValue}"); } } }
3. 配置SignalR服务
在Program.cs中完成SignalR服务注册和Hub路由映射:
var builder = WebApplication.CreateBuilder(args); // 注册SignalR服务 builder.Services.AddSignalR(); var app = builder.Build(); // 映射Hub路由(根据实际需求调整路径) app.MapHub<HubTest>("/hubtest"); app.Run();
4. 客户端实现示例(.NET客户端)
创建.NET控制台客户端,先通过NuGet安装Microsoft.AspNetCore.SignalR.Client包,再实现交互逻辑:
using Microsoft.AspNetCore.SignalR.Client; var connection = new HubConnectionBuilder() .WithUrl("http://localhost:5000/hubtest") .Build(); // 注册服务端会调用的GetResult方法 connection.On<string, Task<int>>("GetResult", async (message) => { Console.WriteLine(message); Console.Write("Enter your guess: "); var input = Console.ReadLine(); return int.Parse(input); }); // 监听服务端返回的最终结果 connection.On<string>("EndResult", (message) => { Console.WriteLine(message); }); // 连接成功后触发服务端的WaitForResult方法 connection.On<string>("Connected", async (connectionId) => { Console.WriteLine(connectionId); await connection.InvokeAsync("WaitForResult", connectionId); }); await connection.StartAsync(); Console.WriteLine("Connected to hub."); Console.ReadLine(); await connection.StopAsync();
5. 关键注意事项
- Client Results功能要求客户端和服务端均使用.NET 7及以上版本的SignalR组件。
- 客户端必须注册服务端调用的目标方法(如示例中的
GetResult),否则服务端调用会超时失败。 - 无需额外配置协议版本,默认配置即可保证兼容。
内容的提问来源于stack exchange,提问作者Caio Sant'Anna
相关产品推荐
相关产品推荐

