SignalR IAssemblyLocator覆盖未触发

时间:2013-06-12 11:06:11

标签: signalr signalr-hub

我有一个简单的应用程序,它使用多个集线器,一些在同一个项目中,一个在另一个类库中,一切正常。现在,我想尝试使用CSharpCodeProvider.CompileAssemblyFromSource加载在运行时创建的集线器,并让我的客户端与该集线器通信。它没有显示在/ signalr / hubs /.

作为我努力工作的几件事之一,我正在尝试使用如下所述的自定义IAssemblyLocator:

https://github.com/SignalR/SignalR/wiki/Extensibility

但据我所知,我的GetAssemblies()代码没有被调用。这是我的Global.asax.cs:

protected void Application_Start()
{
    GlobalHost.DependencyResolver.Register(typeof(IAssemblyLocator), () => new AssemblyLocator());

    var config = new HubConfiguration
    {
        EnableCrossDomain = true
    };

    RouteTable.Routes.MapHubs(config);

    AreaRegistration.RegisterAllAreas();
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

和自定义IAssemblyLocator:

public class AssemblyLocator : IAssemblyLocator
{
    public IList< Assembly > GetAssemblies()
    {
        throw new Exception("I will break stuff");

        IList<Assembly> allAsms = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();

        foreach( Assembly asm in HubFactory.HubAssemblies )
        {
            allAsms.Add( asm );
        }

        return allAsms;
    }
}

正如你所看到的,我正在做的第一件事是抛出一个异常,只是为了证明这个代码被调用,但它不会被抛出。有了这段代码,我的应用程序将继续正常工作,我的页面/客户端仍然可以向我的集线器发送消息。

对于后台,我希望使用一个连接在同一个网页上运行多个单独的数据源,使用在运行时创建的集线器而不是编译时。所以我需要能够在运行时创建和加载集线器,让它出现在/ signalr / hubs /中。我很确定我的运行时创建的集线器是正常的 - 我已经生成了代码,将其粘贴到常规.cs文件中并在编译时包含它,然后在/ signalr / hubs中显示OK。由于共享连接,似乎无法使用具有一个集线器的组。我应该能够使用GetHubContext(string)找到运行时创建的集线器。

欢迎所有想法!

1 个答案:

答案 0 :(得分:2)

MapHubs实际上取代了默认的解析器。尝试更改订单。

var config = new HubConfiguration
{
    EnableCrossDomain = true
};

RouteTable.Routes.MapHubs(config);

GlobalHost.DependencyResolver.Register(typeof(IAssemblyLocator), () => new AssemblyLocator());