2013-01-24 89 views
4

自从早期版本开始使用SignalR并一路升级之后,我将应用程序部署到了Windows Server 2008 R2生产服务器,现在应用程序因“Hub无法解析”而崩溃。例外。SignalR请求投掷“Hub无法解决。”

编辑:堆栈跟踪新增:

[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 

在我的dev的机器和本地测试服务器我越来越没有问题。

有问题的中心是非常简单的:

[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

+0

检查此堆栈线程http://stackoverflow.com/questions/12494355/signalr-dependency-injection-via-spring-net –

+0

什么是SignalRDependencyResolver – davidfowl

+0

**在哪里**异常发生在什么stacktrace?完整的错误信息很重要。 – usr

回答

3

现在这是一个老问题,但它饲养它丑恶的头又在本周末。在花费大量时间调查后,我发现SignalR并不是在部署中被破坏的唯一东西,我的WebAPI也在抛出找不到控制器异常。

原来,这是由于SignalR和WebApi的内部反映了网站程序集中的所有类型。一个TypeLoadException被抛出,在我的情况下,由于有一个类派生的RoleEntryPoint是一个Azure类型,但由于该网站正在部署在非Azure环境中,事情崩溃了。从非Azure构建中简单排除此类型解决了此问题。

如果这些TypeLoadExceptions更加明显,但它存在,那将会很不错。

+0

谢谢。也有类型错误。它需要RedGate的Reflector和RemoteDebugger发现无法加载System.Web.Http和System.Net.Http。隐藏这样的例外不是很聪明。 – Schadensbegrenzer

3

我刚刚受到这个问题的困扰,而且我深入了解了一点,刚刚发现了一个可能的解决方案。 我的集线器类没有组装Web项目,它们在一些引用的程序集中。这是多层应用程序中非常常见的情况。

启动时,signalR将尝试通过IAssemblyLocator实例查找集线器类。在IIS站点中部署时,此IAssemblyLocator实例将查找所有引用的程序集。但是在这个时候,应用程序只是在启动过程中,这意味着很多(引用但尚未加载的)程序集可能未被owin主机环境收集。 因此,集线器类的查找失败。

所以,只需将您的程序集添加到Web的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()); 
1

与@Jijie Chen类似,当我遇到此问题时,我发现它无法加载包含我的集线器的程序集。虽然对我来说修复更直接。就我而言,我有三个项目。所有的逻辑,包括集线器都在它自己的项目中,我有两个项目旨在使用owin。一个是控制台项目,工作正常。然后我将它改编成一个windows服务来托管它。好吧,我设法忘记了包含我的中心项目的参考。这仍然编译得很好,因为主机代码依赖于在运行时加载集线器的signalr/owin映射函数,而不是编译时间。所以当我启动服务并尝试连接时,我得到了集线器没有定义的错误在这里描述,因为它找不到我的集线器的程序集。

10

我有这个相同的错误,由于我的Hub类是internal,因此SignalR无法在我的程序集中找到它。

将集线器设置为public解决了该问题。

+0

这工作对我来说 – Nawaz

+0

我也是如此。谢谢! – TBone

+0

就是这样,谢谢! – Haukman