【问题标题】:Simple Injector (3.1.5) & SignalR (2.2): SimpleInjector.ActivationException简单注射器 (3.1.5) 和 SignalR (2.2):SimpleInjector.ActivationException
【发布时间】:2016-06-20 11:39:25
【问题描述】:

我尝试实施here 建议的集成。不幸的是,我的集线器方法没有被调用。这个异常阻止它:

SimpleInjector.ActivationException 发生。 HResult=-2146233088
Message=无法访问已处置的对象。对象名称: “SimpleInjector.Scope”。来源=SimpleInjector StackTrace: 北 SimpleInjector.InstanceProducer.GetInstance() InnerException: H结果=-2146232798 Message=无法访问已处置的对象。对象名称:“SimpleInjector.Scope”。 ObjectName=SimpleInjector.Scope Source=SimpleInjector 堆栈跟踪: 北 SimpleInjector.Scope.ThrowObjectDisposedException() 北 SimpleInjector.Scope.RequiresInstanceNotDisposed() bei SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration2 登记) bei SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration2 注册,Scope范围) 北 SimpleInjector.Advanced.Internal.LazyScopedRegistration2.GetInstance(Scope 范围) bei lambda_method(闭包) bei Glimpse.SimpleInjector.SimpleInjectorTab.CollectResolvedInstance(InitializationContext 上下文,Func1 实例生产者) bei SimpleInjector.Container.c__DisplayClass52_0.b__0() 北 SimpleInjector.InstanceProducer.GetInstance() 内部异常:

这个扔在:

SimpleInjector.dll!SimpleInjector.InstanceProducer.GetInstance() Unbekannt SimpleInjector.dll!SimpleInjector.Container.GetInstance(System.Type serviceType) Unbekannt idee5.Dispatcher.dll!SimpleInjector.SignalR.SimpleInjectorHubActivator.Create(Microsoft.AspNet.SignalR.Hubs.HubDescriptor 描述符) Zeile 11 C# Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub(string hubName) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.HubDispatcher.CreateHub(Microsoft.AspNet.SignalR.IRequest 请求,Microsoft.AspNet.SignalR.Hubs.HubDescriptor 描述符,字符串 connectionId,Microsoft.AspNet.SignalR .Hubs.StateChangeTracker 跟踪器,bool throwIfFailedToCreate) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReceived(Microsoft.AspNet.SignalR.IRequest request, 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(字符串数据)Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Transports.WebSocketTransport.OnMessage(字符串消息) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.WebSockets.DefaultWebSocketHandler.OnMessage(字符串消息) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.WebSockets.WebSocketHandler.ProcessWebSocketRequestAsync(System.Net.WebSockets.WebSocket webSocket, System.Threading.CancellationToken disconnectToken, System.Func> messageRetriever, 对象状态) Unbekannt mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext(object stateMachine) Unbekannt mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) Unbekannt mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, 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(对象状态)Unbekannt System.Web.dll!System.Web.AspNetSynchronizationContext.Post.AnonymousMethod__0() Unbekannt System.Web.dll!System.Web.Util.SynchronizationHelper.SafeWrapCallback(System.Action action) 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 回调, 对象状态, bool preserveSyncCtx) Unbekannt mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, 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()

另一个可疑的例外是:

SimpleInjector.ActivationException ist aufgetreten。 H结果=-2146233088 Message=SchedulerHub 注册为“混合执行上下文范围/Web 请求”生活方式,但在混合执行上下文范围/Web 请求的上下文之外请求实例。 Source=SimpleInjector 堆栈跟踪: bei SimpleInjector.Scope.GetScopelessInstance[TService,TImplementation](ScopedRegistration`2注册) 内部异常:

这个扔在:

SimpleInjector.dll!SimpleInjector.Scope.GetScopelessInstance(SimpleInjector.Lifestyles.ScopedRegistration 注册) Unbekannt SimpleInjector.dll!SimpleInjector.Scope.GetInstance(SimpleInjector.Lifestyles.ScopedRegistration 注册,SimpleInjector.Scope 范围)Unbekannt SimpleInjector.dll!SimpleInjector.Advanced.Internal.LazyScopedRegistration.GetInstance(SimpleInjector.Scope 范围) Unbekannt [轻量级功能]
Glimpse.SimpleInjector.dll!Glimpse.SimpleInjector.SimpleInjectorTab.CollectResolvedInstance(SimpleInjector.Advanced.InitializationContext context, System.Func instanceProducer) Unbekannt SimpleInjector.dll!SimpleInjector.Container.ApplyResolveInterceptor.AnonymousMethod__0() Unbekannt SimpleInjector.dll!SimpleInjector.InstanceProducer.GetInstance() Unbekannt SimpleInjector.dll!SimpleInjector.Container.GetInstance(System.Type serviceType) Unbekannt idee5.Dispatcher.dll!SimpleInjector.SignalR.SimpleInjectorHubActivator.Create(Microsoft.AspNet.SignalR.Hubs.HubDescriptor 描述符) Zeile 11 C# Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub(string hubName) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.HubDispatcher.CreateHub(Microsoft.AspNet.SignalR.IRequest 请求,Microsoft.AspNet.SignalR.Hubs.HubDescriptor 描述符,字符串 connectionId,Microsoft.AspNet.SignalR .Hubs.StateChangeTracker 跟踪器,bool throwIfFailedToCreate) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.HubDispatcher.GetHubs.AnonymousMethod__39(Microsoft.AspNet.SignalR.Hubs.HubDescriptor 描述符)Unbekannt System.Core.dll!System.Linq.Enumerable.WhereSelectListIterator.MoveNext() Unbekannt System.Core.dll!System.Linq.Enumerable.WhereEnumerableIterator.MoveNext() Unbekannt mscorlib.dll!System.Collections.Generic.List.List(System.Collections.Generic.IEnumerable 集合) Unbekannt System.Core.dll!System.Linq.Enumerable.ToList(System.Collections.Generic.IEnumerable source) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ExecuteHubEvent(Microsoft.AspNet.SignalR.IRequest 请求,字符串 connectionId,System.Func 操作)Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReconnected(Microsoft.AspNet.SignalR.IRequest 请求,字符串 connectionId) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequestPostGroupRead.AnonymousMethod__5() 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__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 连接,System.Func 初始化) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Transports.ForeverTransport.ProcessReceiveRequest(Microsoft.AspNet.SignalR.Transports.ITransportConnection 连接) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Transports.ForeverTransport.ProcessRequestCore.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 任务,System.Func 继任者,Microsoft.AspNet.SignalR.Transports.ForeverTransport arg1,Microsoft.AspNet.SignalR .Transports.ITransportConnection arg2) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Transports.ForeverTransport.ProcessRequestCore(Microsoft.AspNet.SignalR.Transports.ITransportConnection 连接) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Transports.WebSocketTransport.ProcessRequest.AnonymousMethod__2(Microsoft.AspNet.SignalR.Hosting.IWebSocket socket) Unbekannt Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Owin.OwinWebSocketHandler.RunWebSocketHandler.AnonymousMethod__0() Unbekannt mscorlib.dll!System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Startc__DisplayClass1.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 回调, 对象状态, bool preserveSyncCtx) Unbekannt mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, 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

两个都被抓住了。我怀疑这就是似乎什么都没有发生并且我的集线器方法没有被调用的原因。

经过一些尝试错误的会话后,我最终得到了这个容器配置。

    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;
}

我的中心激活器:

    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;
}

我的中心调度员:

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;
}

如何防止此异常并让我的中心方法被调用?

【问题讨论】:

  • 英文的异常信息是什么?
  • 请发布完整的堆栈跟踪(带有内部异常详细信息)。
  • 嗨史蒂文。我添加了一个英文版本,并且在诊断工具中出现了异常。
  • 抱歉耽搁了。必须弄清楚如何获得有关异常的更多详细信息。
  • 您遗漏了内部异常详细信息。请添加这些。

标签: c# signalr simple-injector


【解决方案1】:

从堆栈跟踪中,我看到调用了默认的HubDispatcher,而不是您的自定义SimpleInjectorHubDispatcher。这意味着没有应用范围,这可能是您收到消息“在混合执行上下文范围/Web 请求的上下文之外请求实例”的原因。

您应该按如下方式注册您的SimpleInjectorHubDispatcher: 我认为错误在以下行:

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

【讨论】:

  • 还有一件事。我注册了 typeof(SimpleInjectorHubDispatcher)。使用 typeof(HubDispatcher),未创建集线器。
【解决方案2】:

感谢 Stevens 的聊天支持和深入挖掘,我发现了这个缺陷。我把中心的生活方式和使用的服务混为一谈。

困难的部分是收集有关静默失败的 SignalR 调用的任何详细信息。如果其他人遇到这种情况,我想分享两个关于如何收集更多信息的提示:

  • 仔细查看调试输出并查找可疑异常。
  • 如果发生这些情况,请告诉 Visual Studio 中断。

这样你就可以掌握堆栈跟踪、内部异常等。否则你将找不到原因。 就我而言,我监控了 SimpleInjector.ActivationException,Steven 帮我找到了原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多