2016-06-20 20 views
2

Ich versuche, die vorgeschlagene Integration here zu implementieren. Leider werden meine Hub-Methoden nicht aufgerufen. Diese Ausnahme verhindert es:Einfacher Injektor (3.1.5) & SignalR (2.2): SimpleInjector.ActivationException

SimpleInjector.ActivationException aufgetreten. HResult = -2146233088
Message = Das entsorgte Objekt kann nicht zugegriffen werden. Objektname: "SimpleInjector.Scope". Quelle = SimpleInjector StackTrace: bei SimpleInjector.InstanceProducer.GetInstance() InnerException: HResult = -2146232798 Nachricht = auf das Objekt kann nicht zugegriffen werden. Objektname: "SimpleInjector.Scope". ObjektName = SimpleInjector.Scope Source = SimpleInjector Stacktrace: bei SimpleInjector.Scope.ThrowObjectDisposedException() bei SimpleInjector.Scope.RequiresInstanceNotDisposed() bei SimpleInjector.Scope.GetInstance [TService, TImplementation] (ScopedRegistration2 Registrierung) bei SimpleInjector.Scope.GetInstance [TService, TImplementation] (ScopedRegistration2 Registrierung Scope scope) bei SimpleInjector.Advanced.Internal.LazyScopedRegistration2.GetInstance (Scope scope) bei lambda_method (Closure) bei Glimpse.SimpleInjector.SimpleInjectorTab.CollectResolve dInstance (Initialisierungskontext Kontext, Func1 instanceProducer) bei SimpleInjector.Container. <> c__DisplayClass52_0.b__0() bei SimpleInjector.InstanceProducer.GetInstance() Innerexception:

Dieser wird geworfen auf:

SimpleInjector.dll SimpleInjector.InstanceProducer.GetInstance() Unbekannt SimpleInjector.Container.GetInstance (System.Type serviceType) Unbekannt idee5.Dispatcher.dll! SimpleInjector.SignalR.SimpleInjectorHubActivator.Create (Microsoft.AspNet.SignalR.Hubs.HubDescriptor descriptor) Zeile 11 C# Microsoft.AspNet .SignalR.Core.dll! Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub (Zeichenfolge hubName) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Hubs.HubDispatcher.CreateHub (Microsoft.AspNet. SignalR.IRequest-Anforderung, Microsoft.AspNet.SignalR.Hubs.HubDescriptor-Deskriptor, Zeichenfolge connectionId, Microsoft.AspNet.SignalR.Hubs.StateChangeTracker-Tracker, bool throwIfFailedToCreate) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR .Hubs.HubDispatcher.OnReceived (Microsoft.AspNet.SignalR.IRequest Anfrage, string connectionId, string data) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequestPostGroupRead.AnonymousMethod__7() Unbekannt Microsoft .AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.TaskAsyncHelper.FromMethod (System.Func func) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequestPostGroupRead.AnonymousMethod__6 (Zeichenfolgedaten) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Transports.WebSocketTransport.OnMessage (Zeichenfolge Nachricht) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.WebSockets.DefaultWebSocketHandler.OnMessage (Zeichenfolge Nachricht) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.WebSockets.WebSocketHandler .ProcessWebSocketRequestAsync (System.Net.WebSockets.WebSocketWebSocket, System.Threading.CancellationToken disconnectToken, System.Func> messageRetriever, Objektzustand) Unbekannt mscorlib.dll! System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext (Objekt Statemachine) Unbekannt mscorlib.dll! System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext ExecutionContext, System .Threading.ContextCallback-Callback, Objektstatus, Bool preserveSyncCtx) Unbekannt mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback-Callback, Objektstatus, bool preserveSyncCtx) Unbekannt mscorlib. dll! System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.Run() Unbekannt mscorlib.dll! System.Runtime.CompilerServices.AsyncMethodBuilderCore.OutputAsyncCausalityEvents.AnonymousMethod__0() Unbekannt mscorlib .dll! System.Runtime.CompilerServices.AsyncMethodBuilderCore.ContinuationWrapper.Invoke() Unbekannt mscorlib.dll! System.Runtime.CompilerServices.TaskAwaiter.OutputWaitEtwEvents.AnonymousMethod__0() Unbekannt mscorlib.dll! System.Runtime.CompilerServices.AsyncMethodBuilderCore.ContinuationWrapper .Invoke() Unbekannt mscorlib.dll! System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation..cctor.AnonymousMethod__8_0 (Objektzustand) Unbekannt System.Web.dll! System.Web.AspNetSynchronizationContext.Post.AnonymousMethod__0() Unbekannt System.Web .dll! System.Web.Util.SynchronizationHelper.SafeWrapCallback (System.Action-Aktion) Unbekannt System.Web.dll! System.Web.Util.SynchronizationHelper.QueueAsynchronous.AnonymousMethod__0 (System.Threading.Tasks.Task _) Unbekannt mscorlib.dll! System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke() Unbekannt mscorlib.dll! System.Threading.Tasks.Task.Execute() Unbekannt mscorlib.dll! System.Threading.Tasks.Task.ExecutionContextCallback (Object Obj Unbekannt) mscorlib.dll! System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext ExecutionContext, System.Threading.ContextCallback Rückruf, Objektzustand, bool preserveSyncCtx) Unbekannt mscorlib.dll! System.Threading.ExecutionContext.Run (System .Threading.ExecutionContext executionContext, System.Threading.ContextCallback-Rückruf, Objektstatus, bool preserveSyncCtx) Unbekannt mscorlib.dll! System.Threading.Tasks.Task.ExecuteWithThreadLocal (ref System.Threading.Tasks.Task currentTaskSlot) Unbekannt mscorlib.dll ! System.Threading.Tasks.Task.ExecuteEntr y (Bool bPreventDoubleExecution) Unbekannt mscorlib.dll! System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() Unbekannt mscorlib.dll! System.Threading.ThreadPoolWorkQueue.Dispatch() Unbekannt mscorlib.dll!-System .Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Eine weitere verdächtige Ausnahme ist:

SimpleInjector.ActivationException ist aufgetreten. HResult = -2146233088 Message = Der SchedulerHub wird als 'Hybridausführungskontextbereich/Webanforderung' registriert, aber die Instanz wird außerhalb des Kontexts eines Kontextkontexts/Webanforderung für Hybridausführung angefordert. Source = SimpleInjector Stacktrace: bei SimpleInjector.Scope.GetScopelessInstance [TService, TImplementation] (ScopedRegistration`2 Registrierung) Innerexception:

SimpleInjector.dll:

Dieser ist in geworfen! SimpleInjector.Scope.GetScopelessInstance (SimpleInjector.Lifestyles.ScopedRegistration registration) Unbekannt SimpleInjector.dll! SimpleInjector.Scope.GetInstance (SimpleInjector.Lifestyles.ScopedRegistration Registrierung SimpleInjector.Scope scope) Unbekannt SimpleInjector.dll! SimpleInjector.Advanced.Internal.LazyScopedRegistration.GetInstance (SimpleInjector.Scope scope) Unbekannt [Lightweightfunktion]
Glimpse.SimpleInjector.dll! Glimpse.SimpleInjector.SimpleInjectorTab.CollectResolvedInstance (SimpleInjector.Advanced.InitializationContext Zusammenhang System.Func instanceProducer) Unbekannt SimpleInjector.dll! SimpleInjector.Container.ApplyResolveInterceptor.AnonymousMethod__0() Unbekannt SimpleInjector.dll! SimpleInjector.InstanceProducer.GetInstance() Unbekannt SimpleInjector.Container.GetInstance (System.Type serviceType) Unbekannt idee5.Dispatcher.dll! Simpl eInjector.SignalR.SimpleInjectorHubActivator.Create (Microsoft.AspNet.SignalR.Hubs.HubDescriptor descriptor) Zeile 11 C# Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub (Zeichenfolge hubName) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Hubs.HubDispatcher.CreateHub (Microsoft.AspNet.SignalR.IRequest Anfrage, Microsoft.AspNet.SignalR.Hubs.HubDescriptor Beschreiber, string connectionId, Microsoft.AspNet.SignalR .Hubs.StateChangeTracker Verfolger, bool throwIfFailedToCreate) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Hubs.HubDispatcher.GetHubs.AnonymousMethod__39 (Microsoft.AspNet.SignalR.Hubs.HubDescriptor descriptor) Unbekannt System. Core.dll! System.Linq.Enumerable.WhereSelectListIterator.MoveNext() Unbekannt System.Core.dll! System.Linq.Enumerab le.WhereEnumerableIterator.MoveNext() Unbekannt mscorlib.dll! System.Collections.Generic.List.List (System.Collections.Generic.IEnumerable-Auflistung) Unbekannt System.Core.dll! System.Linq.Enumerable.ToList (System. Collections.Generic.IEnumerable Quelle) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ExecuteHubEvent (Anforderung von Microsoft.AspNet.SignalR.IRequest, Zeichenfolge connectionId, Aktion System.Func) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReconnected (Microsoft.AspNet.SignalR.IRequest Anfrage, string connectionId) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet. SignalR.PersistentConnection.ProcessRequestPostGroupRead.AnonymousMethod__5() Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.Asp Net.SignalR.TaskAsyncHelper.FromMethod (System.Func func) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequestPostGroupRead.AnonymousMethod__4() Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Transports.ForeverTransport.ProcessReceiveRequest.AnonymousMethod__1c() Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Transports.ForeverTransport.ProcessMessages (Microsoft.AspNet.SignalR.Transports.ITransportConnection -Verbindung, System.Func initialize) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Transports.ForeverTransport.ProcessReceiveRequest (Microsoft.AspNet.SignalR.Transports.ITransportConnection-Verbindung) Unbekannt Microsoft.AspNet.SignalR.Core. dll! Microsoft.AspNet.SignalR.Transports.ForeverTransport.Process RequestCore.AnonymousMethod__e (Microsoft.AspNet.SignalR.Transports.ForeverTransport t, Microsoft.AspNet.SignalR.Transports.ITransportConnection c) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.TaskAsyncHelper.FromMethod (System. Func func, System .__ Canon arg1, System .__ Canon arg2) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.TaskAsyncHelper.Then (System.Threading.Tasks.Task Aufgabe, System.Func Nachfolger, Microsoft .AspNet.SignalR.Transports.ForeverTransport arg1, arg2 Microsoft.AspNet.SignalR.Transports.ITransportConnection) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Transports.ForeverTransport.ProcessRequestCore (Microsoft.AspNet.SignalR .Transports.ITransportConnection-Verbindung) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Transports.WebSocketTransport.ProcessRequest.AnonymousMethod__2 (Microsoft.AspNet.SignalR.Hosting.IWebSocket Buchse) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Owin.OwinWebSocketHandler.RunWebSocketHandler.AnonymousMethod__0() Unbekannt mscorlib.dll!-System. Runtime.CompilerServices.AsyncTaskMethodBuilder.Startc__DisplayClass1. < b__0> d__3 Statemachine) Unbekannt Microsoft.AspNet.SignalR.Core.dll! Microsoft.AspNet.SignalR.Owin.OwinWebSocketHandler.RunWebSocketHandler.AnonymousMethod__0() Unbekannt mscorlib.dll! System.Threading.Tasks.Task.InnerInvoke() unbekannt mscorlib.dll! System.Threading.Tasks.Task.Execute() unbekannt mscorlib.dll! System.Threading.Tasks.Task.ExecutionContextCallback (object obj) unbekannt mscorlib.dll! System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback-Callback, Objektstatus, bool preserveSyncCtx) Unbekannt mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback-Callback, Objektstatus , bool preserveSyncCtx) Unbekannt mscorlib.dll! System.Threading.Tasks.Task.ExecuteWithThreadLocal (ref System.Threading.Tasks.Task currentTaskSlot) Unbekannt mscorlib.dll! System.Threading.Tasks.Task.ExecuteEntry (bool bPreventDoubleExecution) Unbekannt mscorlib.dll! System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() Unbekannt mscorlib.dll! System.Threading.ThreadPoolWorkQueue.Dispatch() Unbekannt mscorlib.dll! System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() Unbekannt

Beide sind gefangen. Und ich vermute, das ist der Grund, warum nichts zu passieren scheint und meine Hub-Methoden nicht aufgerufen werden.

Nach einigen try'n'error-Sitzungen endete ich mit dieser Containerkonfiguration.

public static Container GetInitializeContainer(IAppBuilder app) { 
    // configure AutoMapper 
    MapperConfiguration mapperConfig = ConfigureMappings(); 

    // Create the container as usual. 
    var container = new Container(); 
    ScopedLifestyle hybrid = Lifestyle.CreateHybrid(
     () => container.GetCurrentExecutionContextScope() != null, 
     new ExecutionContextScopeLifestyle(), 
     new WebRequestLifestyle()); 
    container.Options.DefaultScopedLifestyle = hybrid; 

    // Registering the types 
    container.RegisterSingleton(() => mapperConfig.CreateMapper()); 
    container.RegisterSingleton(app); 
    container.RegisterPerWebRequest<IUrlHelperProvider, UrlHelperProvider>(); 
    // register the singleton services 
    container.RegisterSingleton<ICacheService>(new CacheService()); 
    container.RegisterSingleton<ILoggingService, LoggingService>(); 

    // register application services 
    // get the assembly containing the services 
    Assembly repositoryAssembly = typeof(CompanyService).Assembly; 
    // get the services namespace 
    string @namespace = typeof(CompanyService).Namespace; 
    // register all interfaces in the assembly besides the singletons 
    var registrations = 
     from type in repositoryAssembly.GetExportedTypes() 
     where type.Namespace == @namespace 
     where type.GetInterfaces().Any(i => i.Name.EndsWith(value: "Service") && 
      i.Name != nameof(ICacheService) && i.Name != nameof(ILoggingService)) 
     select new { Service = type.GetInterfaces().Single(i => i.Name.EndsWith(value: "Service")), Implementation = type }; 

    foreach (var reg in registrations) { 
     container.Register(reg.Service, reg.Implementation, new WebRequestLifestyle()); 
    } 

    container.RegisterPerWebRequest<ApplicationUserManager>(); 
    container.RegisterPerWebRequest<IUserStore<IdentityUser, Guid>>(() => new UserStore()); 
    container.RegisterInitializer<ApplicationUserManager>(manager => InitializeUserManager(manager, app)); 
    // register the role manager 
    container.RegisterPerWebRequest<ApplicationRoleManager>(); 
    container.RegisterPerWebRequest<IRoleStore<IdentityRole, Guid>>(() => new RoleStore()); 
    container.RegisterInitializer<ApplicationRoleManager>(manager => InitializeRoleManager(manager)); 

    container.Register<Hubs.SchedulerHub, Hubs.SchedulerHub>(Lifestyle.Scoped); 
    // register the sign in manager 
    container.RegisterPerWebRequest<ApplicationSignInManager>(); 
    container.RegisterPerWebRequest(() => AdvancedExtensions.IsVerifying(container) 
      ? new OwinContext(new Dictionary<string, object>()).Authentication 
      : HttpContext.Current.GetOwinContext().Authentication); 

    // Register all controllers and filters. Including those in MVC areas 
    container.RegisterMvcControllers(); 
    container.RegisterMvcIntegratedFilterProvider(); 

    // register OWIN 
    app.Use(async (context, next) => { 
     using (container.BeginExecutionContextScope()) { 
      CallContext.LogicalSetData(name: "IOwinContext", data: context); 
      await next(); 
     } 
    }); 
    container.RegisterSingleton<IOwinContextProvider>(new CallContextOwinContextProvider()); 

    return container; 
} 

Meine Nabe Aktivator:

public class SimpleInjectorHubActivator : IHubActivator { 
    public SimpleInjectorHubActivator(Container container) { 
     _container = container; 
    } 

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

    private readonly Container _container; 
} 

Meine Nabe Dispatcher:

public class SimpleInjectorHubDispatcher : HubDispatcher { 
    public SimpleInjectorHubDispatcher(Container container, HubConfiguration configuration) 
     : base(configuration) { 
     _container = container; 
    } 

    protected override Task OnConnected(IRequest request, string connectionId) { 
     return Invoke(() => base.OnConnected(request, connectionId)); 
    } 

    protected override Task OnReceived(IRequest request, string connectionId, string data) { 
     return Invoke(() => base.OnReceived(request, connectionId, data)); 
    } 

    protected override Task OnDisconnected(IRequest request, string connectionId, 
     bool stopCalled) { 
     return Invoke(() => base.OnDisconnected(request, connectionId, stopCalled)); 
    } 

    protected override Task OnReconnected(IRequest request, string connectionId) { 
     return Invoke(() => base.OnReconnected(request, connectionId)); 
    } 

    private async Task Invoke(Func<Task> method) { 
     using (_container.BeginExecutionContextScope()) 
      await method(); 
    } 

    private readonly Container _container; 
} 

Wie kann ich diese Ausnahme verhindern und meine Hub Methoden aufgerufen erhalten werden?

+0

Was ist die Botschaft Ausnahme auf Englisch? – Steven

+0

Und bitte posten Sie die komplette Stack-Trace (mit inneren Ausnahmedetails). – Steven

+0

Hallo Steven. Ich fügte eine englische Version und die Ausnahme hinzu, die in den Diagnosewerkzeugen beofre erscheint. – bdongus

Antwort

2

Von der Stapelüberwachung sehe ich, dass der Standard HubDispatcher aufgerufen wird, nicht Ihre benutzerdefinierte SimpleInjectorHubDispatcher.Dies bedeutet, dass kein Gültigkeitsbereich angewendet wird. Dies ist wahrscheinlich der Grund, warum Sie die Meldung erhalten, dass die Instanz außerhalb des Kontextes eines Kontextkonzepts für die kontextbezogene Ausführung/Webanforderung angefordert wird.

sollten Sie registrieren Ihre SimpleInjectorHubDispatcher wie folgt: ich glaube, der Fehler in der folgenden Zeile ist:

var dispatcher = new SimpleInjectorHubDispatcher(container, config); 
config.Resolver.Register(typeof(HubDispatcher), dispatcher); 
+0

Nur noch eine Sache. Ich registriere typeof (SimpleInjectorHubDispatcher). Mit typeof (HubDispatcher) wurde der Hub nicht erstellt. – bdongus

1

Dank Stevens Chat-Unterstützung und einigen tiefen Graben habe ich den Fehler gefunden. Ich habe die Lebensstile der Drehscheibe und der benutzten Dienste durcheinandergebracht.

Der schwierige Teil war, irgendwelche Details über den stillschweigend ausfallenden SignalR Anruf zu sammeln. Wenn jemand anderes in einer solchen Situation auftritt, möchte ich zwei Tipps zum Sammeln weiterer Informationen teilen:

  • Werfen Sie einen Blick auf Ihre Debug-Ausgabe und suchen Sie nach verdächtigen Ausnahmen.
  • Erklären Sie Visual Studio, um zu brechen, wenn diese auftreten.

Auf diese Weise können Sie die Stack-Trace, innere Ausnahme usw. zu ergreifen, sonst finden Sie nicht den Grund. In meinem Fall überwachte ich SimpleInjector.ActivationException und Steven half mir, den Grund zu finden.