在我的例子中,我的集线器位于从项目代码引用的项目中,该项目代码可以自动托管应用程序.
在线connection.Start().Wait();我得到一个例外.以下是该行抛出的异常序列:
引用项目中的消息中心类的签名是public class MessageHub : Hub.
更新:为了测试该理论,我将hub类从引用的项目移动到我的测试项目中并更新了命名空间.有效.所以我认为这里的理论是合理的......默认的集线器解析在参考项目或单独的命名空间中找不到集线器.
如何说服MapHubs在引用的项目中找到测试中心?
小智 25
我想我找到了答案.
在对源代码进行一些挖掘之后,似乎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();
}
}
Run Code Online (Sandbox Code Playgroud)
这让我尝试简单地将我的外部程序集添加到当前域,因为虽然它被引用但它没有被加载.
所以在调用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();
}
}
Run Code Online (Sandbox Code Playgroud)
Core.Chat就是我正在使用的Hub类.然后加载在引用的程序集中定义的集线器.
可能有更直接的方法来解决这个问题,但我在文档中找不到任何内容.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
4739 次 |
| 最近记录: |