你不应该需要比signalr.hubs
路线更多的东西。如果您将浏览器指向该路由,您将看到它自动找到所有可分配的公共类型IHub
并为它们创建一个 JavaScript 代理。您可以通过 JavaScript 的名称与不同的集线器进行交互,即如果您有以下集线器:
public class GameHub : Hub
您可以通过执行以下操作连接到该特定集线器:
var gameHubProxy = $.connection.gameHub;
您还可以通过将 添加到类来显式指定集线器的名称HubNameAttribute
:
[HubName("AwesomeHub")]
public class GameHub : Hub
然后,您可以通过执行检索特定代理
var awesomeHubProxy = $.connection.awesomeHub;
更新:
我不确定 SignalR 是否能够在同一应用程序的多个路径上运行。它可能会搞砸事情,并且默认的程序集定位器无论如何都无法拾取在运行时加载的集线器。
但是,有一个解决方案,您可以实现自己的解决方案,该解决方案IAssemblyLocator
将从您的插件程序集中获取集线器:
public class PluginAssemblyLocator : DefaultAssemblyLocator
{
private readonly IEnumerable<Assembly> _pluginAssemblies;
public PluginAssemblyLocator(IEnumerable<Assembly> pluginAssemblies)
{
_pluginAssemblies = pluginAssemblies;
}
public override IList<Assembly> GetAssemblies()
{
return base.GetAssemblies().Union(_pluginAssemblies).ToList();
}
}
加载插件后,您应该调用MapHubs
并注册 SignalRsIAssemblyLocator
服务的覆盖:
protected void Application_Start(object sender, EventArgs e)
{
// Load plugins and let them specify their own routes (but not for hubs).
var pluginAssemblies = LoadPlugins(RouteTable.Routes);
RouteTable.Routes.MapHubs();
GlobalHost.DependencyResolver.Register(typeof(IAssemblyLocator), () => new PluginAssemblyLocator(pluginAssemblies));
}
注意:注册您调用的IAssemblyLocator
AFTERMapHubs
,因为它也会覆盖它。
现在,这种方法存在问题。如果您使用的是静态 JavaScript 代理,则不会在每次访问时重新生成它。这意味着如果/signalr/hubs
在加载所有插件/集线器之前访问您的代理,它们将不会被拾取。您可以通过确保在映射路由时加载所有集线器或根本不使用静态代理来解决此问题。
该解决方案仍然需要您获取对插件程序集的引用,我希望这是可行的......