我想我已经找到了答案。
在对源代码进行了一些挖掘之后,SignalR 似乎使用以下方法来指定一个 IAssemblyLocator 来定位 Hub。
internal static RouteBase MapHubs(this RouteCollection routes, string name, string path, HubConfiguration configuration, Action<IAppBuilder> build)
{
var locator = new Lazy<IAssemblyLocator>(() => new BuildManagerAssemblyLocator());
configuration.Resolver.Register(typeof(IAssemblyLocator), () => locator.Value);
InitializeProtectedData(configuration);
return routes.MapOwinPath(name, path, map =>
{
build(map);
map.MapHubs(String.Empty, configuration);
});
}
public class BuildManagerAssemblyLocator : DefaultAssemblyLocator
{
public override IList<Assembly> GetAssemblies()
{
return BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();
}
}
public class DefaultAssemblyLocator : IAssemblyLocator
{
public virtual IList<Assembly> GetAssemblies()
{
return AppDomain.CurrentDomain.GetAssemblies();
}
}
这让我尝试简单地将我的外部程序集添加到当前域,因为虽然它被引用了,但它并没有被加载。
所以在调用 WebApp.Start 之前,我调用了以下行。
static void Main(string[] args)
{
string url = "http://localhost:8080";
// Add this line
AppDomain.CurrentDomain.Load(typeof(Core.Chat).Assembly.FullName);
using (WebApp.Start<Startup>(url))
{
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
}
}
Core.Chat 就是我正在使用的 Hub 类。
然后加载引用程序集中定义的集线器。
可能有更直接的方法可以解决此问题,但我在文档中找不到任何内容。
希望这会有所帮助。