Signalr Castle Windsor在信号器集线器中抛出“范围缓存已被处置”

Signalr Castle Windsor在信号器集线器中抛出“范围缓存已被处置”,signalr,castle-windsor,owin,asp.net-mvc-5.2,wcffacility,Signalr,Castle Windsor,Owin,Asp.net Mvc 5.2,Wcffacility,我们正在开发一个基于 .NET 4.5.1 MVC 5.2.2 奥温 WebApi 2.2 信号机2.2.0 温莎城堡3.3.0 Wcf集成设施3.3.0 为了解析控制器,我们使用ControllerFactory类,该类在以下页面中进行了描述: 为了解决依赖关系,我们使用WindsorDependencyResolver类: public class WindsorDependencyResolver : IDependencyResolver { public IWindsorCo

我们正在开发一个基于

.NET 4.5.1 MVC 5.2.2 奥温 WebApi 2.2 信号机2.2.0 温莎城堡3.3.0 Wcf集成设施3.3.0 为了解析控制器,我们使用ControllerFactory类,该类在以下页面中进行了描述:

为了解决依赖关系,我们使用WindsorDependencyResolver类:

public class WindsorDependencyResolver : IDependencyResolver
{
    public IWindsorContainer Container { get; private set; }

    public WindsorDependencyResolver(IWindsorContainer windsorContainer)
    {
        Container = windsorContainer;
    }

    public IDependencyScope BeginScope()
    {
        return new WindsorDependencyScope(this.Container);
    }

    public object GetService(Type serviceType)
    {
        return this.Container.Kernel.HasComponent(serviceType) ? this.Container.Resolve(serviceType) : null;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return this.Container.ResolveAll(serviceType).Cast<object>().ToArray();
    }

    public void Dispose()
    {
    }
}

public class WindsorDependencyScope : IDependencyScope
{
    public IWindsorContainer Container { get; set; }
    public IDisposable Scope { get; set; }

    public WindsorDependencyScope(IWindsorContainer container)
    {
        this.Container = container;
        this.Scope = container.BeginScope();
    }

    public object GetService(Type serviceType)
    {
        return this.Container.Kernel.HasComponent(serviceType) ? this.Container.Resolve(serviceType) : null;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return this.Container.ResolveAll(serviceType).Cast<object>().ToArray();
    }

    public void Dispose()
    {
        this.Scope.Dispose();
    }
}
所有控制器、wcf服务客户端和拦截器(日志记录类除外)都在项目中向Lifestyle PerWebRequest注册。然而,我们用于日志记录的类是单例的

下面的Web.config中有一个设置:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        ...
        <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" />
        ...
    </modules>
</system.webServer>
我可以在调试器窗口中调用Container.Resolve方法之前看到HttpContext。顺便说一下,我可以解析单例日志类

有趣的是,我的队友没有任何例外。主要区别在于我们的操作系统版本。我在Windows8.1中运行代码,我的队友在Windows7中运行代码


我们只在信号集线器上得到这个例外。我们在其他任何地方都没有例外。我们如何解决这个问题?

我在Startup类中使用ServiceLocator来解析IDependencyResolver。它看起来像:

internal class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute("ActionApi", "{controller}/{action}/{id}", new {id = RouteParameter.Optional});

        config.DependencyResolver = ServiceLocator.Instance.Resolve<IDependencyResolver>();

        appBuilder.UseWebApi(config);
    }
}
也许这有帮助

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Scope cache was already disposed. This is most likely a bug in the calling code.'.
   at Castle.MicroKernel.Lifestyle.Scoped.ScopeCache.get_Item(Object id)
   at Castle.MicroKernel.Lifestyle.Scoped.DefaultLifetimeScope.GetCachedInstance(ComponentModel model, ScopedInstanceActivationCallback createInstance)
   at Castle.MicroKernel.Lifestyle.ScopedLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy)
   at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
   at Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)
   at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)
   at Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler handler, Type service, IDictionary additionalArguments, IReleasePolicy policy)
   at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, IDictionary arguments, IReleasePolicy policy)
   at Castle.MicroKernel.DefaultKernel.Resolve(Type service, IDictionary arguments)
   at Castle.Windsor.WindsorContainer.Resolve[T]()
   at UIServer.WebUI.Hubs.MailThreadHub.Broadcast(MailMessageListDto mailMessage) in c:\Development\DDD\UIServer.WebUI\Hubs\MailThreadHub.cs:line 92
internal class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute("ActionApi", "{controller}/{action}/{id}", new {id = RouteParameter.Optional});

        config.DependencyResolver = ServiceLocator.Instance.Resolve<IDependencyResolver>();

        appBuilder.UseWebApi(config);
    }
}