2013-08-17 109 views
4

我正在编写小型Web应用程序,并且希望使用signalr来创建推送通知,但是当我从其他程序集加载集线器时,什么都不会发生。SignalR无法从外部程序集中找到集线器

这里是我的组件定位件,从中我的asp.net MVC项目

public class HubAssemblyLocator : IAssemblyLocator { 

    public IList<Assembly> GetAssemblies() { 


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

     var executingDirectory = AppDomain.CurrentDomain.BaseDirectory; 

     var assemblyFiles = Directory.EnumerateFiles(executingDirectory, "Application"); 

     foreach (var assemblyFile in assemblyFiles.Where(_ => _.EndsWith(".dll"))) { 

      var asm = Assembly.LoadFile(assemblyFile); 

      if (asm.GetTypes().Any(_ => _.BaseType == typeof(Hub))) { 
       allAsms.Add(asm); 
      } 
     } 

     return allAsms; 
    } 
} 

这里我ApplicationStart事件在Global.asax中

public class MvcApplication : System.Web.HttpApplication { 

    protected void Application_Start() { 

     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     InitializeRepositories.Initialize(); 



     var servicesPre = GlobalHost.DependencyResolver.GetServices(typeof(IAssemblyLocator)); 

     RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true}); 

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

     var servicesPost = GlobalHost.DependencyResolver.GetServices(typeof (IAssemblyLocator)); 
    } 
} 

引用在此问题这个问题解决的其他库,但在我的情况下是行不通的。

SignalR IAssemblyLocator not fired

而且在我的处境组件定位件未执行。

更新:在区域和路线注册之前注册枢纽。

回答

1

RouteTable.Routes.MapHubs()应该在RegisterRoutes()之前被调用,但是在你的Application_Start中被调用。调用MapHubs()后,您也注册HubAssemblyLocator,但逻辑上它应该在之前。

+0

谢谢你的回答,但主要问题是HubAssemblyLocator没有解雇=) – Sam

相关问题