2016-07-25 81 views
2

我想使用简单注入器将单一控制器注入到集线器中。使用简单注射器将控制器注入SignalR集线器

我已经尝试了以下内容,但现在我的状态为500。

集线器代码:

public class EventDataHub : Hub 
    { 
     private static IEventDataController _dataController; 

     public EventDataHub(IEventDataController dataController) 
     { 
      _dataController = dataController; 
     } 

     public void Subscribe(string signal) 
     { 
      _dataController.Subscribe(signal, Context.ConnectionId); 
     } 
    } 

Startup.cs

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 

      var container = new Container(); 

      var hybridLifestyle = Lifestyle.CreateHybrid(
       lifestyleSelector:() => HttpContext.Current != null, 
       trueLifestyle: new WebRequestLifestyle(), 
       falseLifestyle: new LifetimeScopeLifestyle()); 

      container.Register<IEventDataController, EventDataController>(Lifestyle.Singleton); 
      container.Register<IHub, EventDataHub>(hybridLifestyle); 

      container.Verify(); 

      var activator = new SimpleInjectorHubActivator(container); 
      GlobalHost.DependencyResolver.Register(typeof(IHubActivator),() => activator); 

      app.MapSignalR(); 
     } 
    } 

集线器活化剂

public class SimpleInjectorHubActivator : IHubActivator 
    { 
     private readonly Container _container; 

     public SimpleInjectorHubActivator(Container container) 
     { 
      _container = container; 
     } 

     public IHub Create(HubDescriptor descriptor) 
     { 
      return (IHub)_container.GetInstance(descriptor.HubType); 
     } 
    } 

Subscribe方法似乎是从客户端不可到达的。集线器构造函数被执行。

异常堆栈:

[MissingMethodException:此对象中没有定义任何参数构造]
System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔 publicOnly,布尔NOCHECK,布尔& canBeCached, RuntimeMethodHandleInternal &构造函数,Boolean & bNeedSecurityCheck)+0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache,Stack CrawlMark & stackMark)113
System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly, 布尔skipCheckThis,布尔fillCache,StackCrawlMark & stackMark) 206 System.Activator.CreateInstance(类型类型,布尔非公开)83 System.Activator.CreateInstance (类型类型)11 Microsoft.AspNet.SignalR.Hubs.DefaultHubActivator.Create(HubDescriptor 描述符)84
Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub(字符串 hubName)27
Microsoft.AspNet。 SignalR.Hubs.HubDispatcher.CreateHub(IRequest 请求,HubDescriptor描述符,字符串连接Id, StateChangeTracker跟踪器,布尔throwIfFailedToCreate)386
Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReceived(IRequest 请求,字符串的ConnectionId,字符串数据)400
Microsoft.AspNet.SignalR。 <> c__DisplayClass64_1.b__5() 34 Microsoft.AspNet.SignalR.TaskAsyncHelper.FromMethod(Func`1 FUNC)28
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)92
System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.AspNet.SignalR.Transports.d__40.MoveNext() 742 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)+92
系统.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58 Microsoft.Owin.Mapping.d_ _0.MoveNext()+385
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskAwaiter。HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext() +187 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime。 CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext() +185 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult的 AR) +69
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult AR)64
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 380 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔& completedSynchronously)155

编辑:

移动从Startup.cs的DI配置Global.asax中引发此异常:

[ArgumentNullE xception:值不能为null。参数名称: s]的System.IO.StringReader..ctor(字符串或多个)11377176
Microsoft.AspNet.SignalR.Json.JsonSerializerExtensions.Parse(JsonSerializer 串行器,字符串JSON)63
Microsoft.AspNet.SignalR。 Hubs.HubRequestParser.Parse(字符串数据, JsonSerializer串行器)21
Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReceived(IRequest 请求,字符串的ConnectionId,字符串数据)40
Microsoft.AspNet.SignalR。 <> c__DisplayClass64_1.b__5() 34 Microsoft.AspNet.SignalR.TaskAsyncHelper.FromMethod(Func`1 FUNC)28
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)92
System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.AspNet.SignalR.Transports.d__40.MoveNext() 742 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)+92
系统.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58 Microsoft.Owin.Mapping.d_ _0.MoveNext()+385
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.Owin.Host .SystemWeb.IntegratedPipeline.d__5.MoveNext() +187 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
微软.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext() +185 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult。端(IAsyncResult的 AR)69
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult的 AR)65
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 380 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔& completedSynchronously)155

+0

请找到引发的异常,并显示所有在你的问题中这个例外的细节。 – Steven

+0

SignalR应用程序不会崩溃。我包含的异常堆栈在500响应中。 – gerric

+0

从堆栈跟踪中可以清楚地看到SignalR使用它的'DefaultHubActivator'而不是'SimpleInjectorHubActivator'。 – Steven

回答

1

我终于发现了问题:

container.Verify()被打破IHubActivator的登记。所以它必须在之后或永远不会被调用。

此外我删除了容器注册IHub,因为它现在没有工作。 (我说是因为container.Register<IEventDataController, EventDataController>(Lifestyle.Singleton)当时没有工作和固定它在某种程度上)

所以我在最后Startup.cs代码如下所示:

public void Configuration(IAppBuilder app) 
{ 
    var container = new Container(); 

    container.Register<IEventDataController, EventDataController>(Lifestyle.Singleton); 

    var activator = new SimpleInjectorHubActivator(container); 
    GlobalHost.DependencyResolver.Register(typeof(IHubActivator),() => activator); 

    app.MapSignalR(); 
}