如何解决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
相关产品推荐
相关产品推荐

