SignalR 請求拋出“無法解析集線器”。
我從早期版本開始就一直在使用 SignalR,並且一直在升級,但是我已經將我的應用程序部署到了我的 Windows Server 2008 R2 生產伺服器,現在應用程序因“無法解決集線器而崩潰”。例外。
編輯:StackTrace 添加:
[InvalidOperationException: 'stockitems' Hub could not be resolved.] Microsoft.AspNet.SignalR.Hubs.HubManagerExtensions.EnsureHub(IHubManager hubManager, String hubName, IPerformanceCounter[] counters) +426 Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Initialize(IDependencyResolver resolver, HostContext context) +716 Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary`2 environment) +1075 Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary`2 environment) +363 Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute() +68 Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object extraData) +414 [TargetInvocationException: Exception has been thrown by the target of an invocation.] Microsoft.Owin.Host.SystemWeb.CallContextAsyncResult.End(IAsyncResult result) +146 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288在我的開發機器和本地測試伺服器上,我沒有遇到任何問題。
有問題的集線器非常簡單:
[HubName("StockItems")] public class StockItemHub : Hub { }最初我認為這是 HubName 的問題,因此將其刪除,但它仍然會爆炸。
最初我認為這是由於依賴注入,所以我將 Global.asax 更改為如下所示:
var signalRResolver = new SignalRDependencyResolver(); GlobalHost.DependencyResolver = signalRResolver; var configuration = new HubConfiguration { Resolver = signalRResolver }; RouteTable.Routes.MapHubs(configuration); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, config.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles);編輯:什麼是 SignalRDependencyResolver?SignalRDependencyResolver 在我嘗試解決此問題之前並不存在。因為我相信它是一個依賴注入問題,所以我包裝了 DefaultDependencyResolver 覆蓋 GetService 和 GetServices 以首先檢查我的 Ninject 核心的類型,如果沒有回退到 DefaultDependencyResolver
有任何想法嗎?
伺服器正在執行 IIS7、Windows Server 2008 和 .Net 4.5 該應用程序是 MVC 4 .Net 4.5
由於我的
Hub班級是,我遇到了同樣的錯誤internal,因此 SignalR 在我的程序集中找不到它。設置集線器以
public解決問題。
我剛剛遇到這個問題,我深入探勘了一點,並且剛剛找到了一個可能的解決方案。我的中心類不在 Web 項目的程序集中,它們在一些引用的程序集中。這是多層應用程序中非常常見的場景。
啟動時,signalR 將嘗試通過 IAssemblyLocator 實例查找集線器類。在 IIS 站點中部署時,此 IAssemblyLocator 實例會查找所有引用的程序集。但是此時,應用程序只是在啟動期間,這意味著許多(已引用但尚未載入)程序集可能尚未被 owin 主機環境收集。因此,中心類的查找失敗。
因此,只需將您的程序集添加到 Web.Config 的 system.web/compilation/assemblies 部分:
<system.web> <compilation targetFramework="4.5"> <assemblies> <add assembly="HubAssembly, Version=1.0.0.0, Culture=neutral"/> </assemblies> </compilation> </system.web>或者,如果您願意,也可以通過實現自定義 IAssemblyLocator 類來解決此問題,在呼叫 app.MapSignalR 後立即將其註冊到依賴解析器中。
using Microsoft.AspNet.SignalR.Hubs; public class AssemblyLocator : IAssemblyLocator { public IList<System.Reflection.Assembly> GetAssemblies() { // list your hubclass assemblies here return new List<System.Reflection.Assembly>(new []{typeof(HubAssembly.HubClass).Assembly}); } } // add following code to OwinStartup class's Configuration method app.MapSignalR(); GlobalHost.DependencyResolver.Register(typeof(Microsoft.AspNet.SignalR.Hubs.IAssemblyLocator), () => new AssemblyLocator());