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
相关产品推荐
相关产品推荐

