c# - Ninject.Web.MVC + MVC3 抛出 StackOverflowException

标签 c# asp.net-mvc ninject asp.net-mvc-3

我有一个使用 ASP.NET MVC3 和 Ninject.Web.MVC(MVC3 版本)的简单 Web 应用程序。

除了应用程序结束时,整个过程都运行良好。无论何时结束,内核都会被释放,如 NinjectHttpApplication 中的 Application_End() 所示:

反射器告诉我这个:

public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}

发生的事情是我的网络服务器因 StackOverflowException 而崩溃(我尝试了 IIS7 和 VS2010 中的内置网络服务器)。我只能假设这是问题所在,因为我自己没有在应用程序端编写任何代码。

我发现内核知道如何解析 IKernel(它返回内核本身),这可能会导致堆栈溢出吗?我可以想象会发生这样的事情:

  • Kernel.Dispose()
  • 释放内核中的所有实例
  • 嘿!看看这个,内核也在内核中。返回步骤 1。

换句话说,内核被处置,处置它持有的所有引用(包括自引用),这导致它处置自己。

这有什么意义吗?

编辑:

看来问题出在 NinjectHttpApplication 中。看看这个激活码:

    public void Application_Start()
    {
        lock (this)
        {
            kernel = this.CreateKernel();
            ...
            kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
            ...
        }
    }

看起来没问题,但现在发生的情况是,每当调用 IResolutionRoot 时,内核都会缓存在其自身中。释放内核时清空缓存,释放所有缓存的对象,造成循环引用。

NinjectHttpApplication 的一个简单解决方案是简单地更改绑定(bind)。将常量绑定(bind)更改为方法一:

kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();

成为

kernel.Bind<IResolutionRoot>().ToMethod(x => this.Kernel);

这解决了问题,但我不确定整个循环处理缓存问题是否是 ninject 中的错误。

最佳答案

我遇到了同样的问题。

我最终复制了 NinjectHttpApplication 的代码并删除了 Application_End 函数中的 Kernel.Dispose()

public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            //kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}

这应该可以修复错误。不过不确定是否有针对它的计划修复。

关于c# - Ninject.Web.MVC + MVC3 抛出 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4327151/

相关文章:

c# - 根据ComboBox确定MessageBoxIcon

c# - DataTable与MySQL数据库同步的两种方式

wcf - Global.asax 的 Application_Start 方法没有被调用

c# - 绘制一个点

c# - 使用 < 和 > 运算符时支持哪些隐式转换?

asp.net-mvc - 如何在 ASP.Net MVC 3 中路由遗留的 QueryString 参数?

asp.net - 如何重定向到索引操作,但从 url 中删除 "Index/"?

asp.net-mvc - 如何让 ModelState 键/模型属性名称匹配?

c# - Ninject woes... 404错误问题

c# - 在 MVC 4 中为 3 层架构配置 Ninject