2013-06-12 76 views
2

我有一個簡單的應用程序,它使用幾個集線器,一些在同一個項目中,另一個在另一個類庫中,並且一切正常。現在我想嘗試使用CSharpCodeProvider.CompileAssemblyFromSource加載在運行時創建的集線器,並讓我的客戶端與該集線器進行通信。它沒有顯示在/ signalr/hubs /中。SignalR IAssemblyLocator重寫不會觸發

由於幾件事情我想獲得工作,我試圖使用自定義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 /中。我很確定我的運行時創建的集線器是OK的 - 我已經將生成的代碼放入常規的.cs文件並在編譯時包含它,然後在/ signalr/hubs中顯示OK。由於共享連接,似乎無法使用具有一個集線器的組。我應該能夠使用GetHubContext(string)來查找我的運行時創建的集線器。

歡迎任何想法!

回答

2

MapHubs實際上替代了默認的解析器。嘗試改變順序。

var config = new HubConfiguration 
{ 
    EnableCrossDomain = true 
}; 

RouteTable.Routes.MapHubs(config); 

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

工作就像一個魅力,謝謝! – isaidNO