7

我从早期版本开始就一直在使用 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

4

4 回答 4

14

I had this same error due to my Hub class being internal, therefore SignalR couldn't find it within my assembly.

Setting the hub to public solved the issue.

于 2015-07-30T16:28:41.500 回答
8

我刚刚遇到这个问题,我深入挖掘了一点,并且刚刚找到了一个可能的解决方案。我的中心类不在 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());
于 2014-02-21T16:38:05.247 回答
3

这是一个古老的问题,但本周末它再次抬起了丑陋的头。在花了很多时间调查之后,我发现 SignalR 不是部署中唯一被破坏的东西,我的 WebAPI 也抛出了找不到控制器异常。

原来这是由 SignalR 和 WebApi 的内部反映了 Sites 程序集中的所有类型引起的。一个 TypeLoadException 被抛出,在我的情况下,由于有一个类派生 RoleEntryPoint 这是一个 Azure 类型,但是当站点被部署在非 Azure 环境中时,事情就崩溃了。只需从非 Azure 版本中排除此类型即可解决该问题。

如果这些 TypeLoadExceptions 更明显,那就太好了,但它确实存在。

于 2013-04-23T12:52:14.450 回答
1

与@Jijie Chen 类似,当我遇到这个问题时,我发现它无法加载包含我的集线器的程序集。不过,对我来说,解决方法更简单。就我而言,我有三个项目。包括集线器在内的所有逻辑都在它自己的项目中,我有两个项目打算使用 owin 托管。一个是运行良好的控制台项目。然后我将其调整为 Windows 服务来托管它。好吧,不知何故,我设法忘记了包含对包含我的集线器的项目的引用。这仍然编译得很好,因为主机代码依赖于在运行时而不是编译时加载集线器的信号器/owin 映射函数。因此,当我启动服务并尝试连接时,我得到了集线器没有定义的错误,因为它找不到我的集线器的程序集。

于 2015-06-23T22:12:38.240 回答