You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:55:21