Asp.net-Mvc

SignalR 請求拋出“無法解析集線器”。

  • July 30, 2015

我從早期版本開始就一直在使用 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());

引用自:https://stackoverflow.com/questions/14511376