我想使用簡單注入器將單一控制器注入到集線器中。使用簡單注射器將控制器注入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
請找到引發的異常,並顯示所有在你的問題中這個例外的細節。 – Steven
SignalR應用程序不會崩潰。我包含的異常堆棧在500響應中。 – gerric
從堆棧跟蹤中可以清楚地看到SignalR使用它的'DefaultHubActivator'而不是'SimpleInjectorHubActivator'。 – Steven