SignalR请求投掷"集线器无法解决".

MJJ*_*mes 5 asp.net-mvc asp.net-mvc-4 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
Run Code Online (Sandbox Code Playgroud)

在我的开发机器和本地测试服务器上,我没有遇到任何问题.

有问题的中心非常简单:

 [HubName("StockItems")]
public class StockItemHub : Hub
{

}
Run Code Online (Sandbox Code Playgroud)

最初我认为这是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);
Run Code Online (Sandbox Code Playgroud)

编辑:什么是SignalRDependencyResolver?在我尝试解决此问题之前,SignalRDependencyResolver不存在.因为我认为它是一个依赖注入问题,我将DefaultDependencyResolver包装起来覆盖GetService和GetServices,首先检查我的Ninject内核的类型,如果没有回退到DefaultDependencyResolver

有任何想法吗?

服务器运行IIS7,Windows Server 2008与.Net 4.5该应用程序是MVC 4 .Net 4.5

Con*_*ell 12

由于我的Hub班级internal,我有同样的错误,因此SignalR无法在我的程序集中找到它.

设置集线器以public解决问题.


Jij*_*hen 6

我刚刚遇到这个问题,我深入挖掘,并找到了一个可能的解决方案.我的集线器类不在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>
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,也可以通过实现自定义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());
Run Code Online (Sandbox Code Playgroud)


MJJ*_*mes 3

这是一个老问题了,但这个周末又再次出现了。经过花费大量时间调查后,我发现 SignalR 并不是部署中唯一损坏的东西,我的 WebAPI 也抛出找不到控制器异常。

事实证明,这是由 SignalR 和 WebApi 的内部结构反映了 Sites 程序集中的所有类型引起的。在我的例子中,由于有一个类派生 RoleEntryPoint(它是 Azure 类型)而引发了 TypeLoadException,但由于该站点部署在非 Azure 环境中,所以事情崩溃了。只需从非 Azure 版本中排除此类型即可解决该问题。

如果这些 TypeLoadException 更明显,那就太好了,但事实就是如此。