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

ASP.NET SignalR 2如何通过方法名而非动态调用Hub方法?

解决方案

首先纠正你的反射错误:你试图在Clients类型上直接查找All.{methodName}方法,这是错误的——All是Clients的一个属性,返回的是IClientProxy动态代理对象,目标方法{methodName}是这个属性值对象的成员,而非Clients的成员。

下面提供两种可行方案:

方案一:直接使用IClientProxy接口(推荐)

旧版SignalR 2中,Clients.All本质实现了IClientProxy接口,该接口提供了Invoke方法,可直接通过方法名字符串调用客户端方法,效果和.NET Core SignalR的SendAsync一致:

using Microsoft.AspNet.SignalR;

// 转换为IClientProxy接口
var clientProxy = LegacyHubContext.Clients.All as IClientProxy;
// 调用目标方法(异步方法,建议使用await避免阻塞)
await clientProxy?.Invoke(methodName, name, args);

如果你的代码在同步方法中,可使用.Wait()等待完成(注意避免死锁,建议优先改造为异步):

clientProxy?.Invoke(methodName, name, args).Wait();

方案二:正确使用反射调用

如果你坚持用反射实现,需要先获取All属性的实例,再在该实例的类型中查找目标方法:

// 获取Clients.All的实例
var allClients = LegacyHubContext.Clients.All;
// 根据方法名和参数类型查找MethodInfo
MethodInfo method = allClients.GetType().GetMethod(
    methodName, 
    new Type[] { typeof(string), typeof(object) } // 匹配你的参数类型
);
// 调用方法
method?.Invoke(allClients, new object[] { name, args });

注意:如果方法参数类型和实际传入的不匹配,GetMethod会返回null,需要确保参数类型完全一致。

内容的提问来源于stack exchange,提问作者IFrank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:40:57