在引用的项目中映射集线器

时间:2013-05-27 19:00:51

标签: signalr

http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-host

就我而言,我的集线器位于从项目代码引用的项目中,该项目代码会旋转自托管应用程序。

connection.Start().Wait();行上,我得到一个例外。以下是该行抛出的异常序列:

  1. 指定的注册表项不存在 System.IO.IOException
  2. 'MessageHub'集线器无法解析 InvalidOperationException
  3. 远程服务器返回错误:(500)内部服务器错误 WebException
  4. 引用项目中消息中心类的签名是public class MessageHub : Hub

    更新为了测试理论,我将hub类从引用的项目移动到我的测试项目中并更新了命名空间。有效。所以我认为这里的理论是合理的......默认的集线器解析在参考项目或单独的命名空间中找不到集线器。

    如何说服MapHubs在引用的项目中找到测试中心?

1 个答案:

答案 0 :(得分: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();
    }
}

这让我尝试简单地将我的外部程序集添加到当前域,因为虽然它被引用但它没有被加载。

因此,在调用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类。 然后加载在引用的程序集中定义的集线器。

可能有更直接的方法可以解决这个问题,但我在文档中找不到任何内容。

希望这有帮助。