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

如何解决SignalR中InvokeAsync仅支持单一客户端的InvalidOperationException异常

问题描述

我定义了如下强类型Hub:

public class GameHub : Hub<IGameHubClient>
{
//...
}

public interface IGameHubClient
{
    Task<string> Send(string message);
}

使用HubContext执行await Clients.Others.Send("test")发送消息时,抛出异常:

System.InvalidOperationException: InvokeAsync only works with Single clients.
   at Microsoft.AspNetCore.SignalR.TypedClientBuilder.IGameHubClientImpl.Send(string)

尝试在控制器中通过以下方式使用HubContext:

private readonly IHubContext<GameHub, IGameHubClient> _hub;
//...
await _hub.Clients.All.Send("test 2");

仍出现相同异常,请问该如何解决?

解决方案
  • 调整客户端接口方法的返回类型:IGameHubClient中的Send方法返回Task<string>,这属于SignalR的请求-响应模式,要求必须针对单个客户端调用(比如指定单个连接ID)。如果只是服务端单向推送消息给客户端,需将方法返回值改为无返回值的Task:
public interface IGameHubClient
{
    Task Send(string message);
}
  • 匹配调用范围与方法类型:如果确实需要客户端返回响应(保留Task<string>返回值),则只能对单个客户端发起调用,不能使用Others、All这类多客户端批量操作,必须指定具体的连接ID,示例代码:
// 仅针对单个客户端调用(支持请求-响应)
await _hub.Clients.Client("目标连接ID").Send("test");

内容的提问来源于stack exchange,提问作者D. Squire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:50:25