asp.net-mvc - 我真的需要在关闭应用程序时处理 IUnityContainer

标签 asp.net-mvc unity-container stack-overflow

我正在维护使用 Asp.NET MVC 构建的 Web 应用程序的代码。 MVC 依赖解析器已使用 Unity 容器实现。这是在应用程序关闭时调用的清理代码。

 public static void Shutdown()
 {            
        IUnityContainer container = UnityConfig.GetConfiguredContainer();
        container.Dispose(); //currently when called causes stack overflow            
 }

我们遇到的问题是,在关闭期间调用 dispose(上文)会导致堆栈溢出异常,然后进程因此崩溃。这也会在开发期间调试应用程序并更改 web.config 时发生(因为对 web.config 的更改似乎会重新启动应用程序),这也会停止通常不应结束的调试 session 。如果我删除对处置的调用,似乎不会发生堆栈溢出,然后应用程序会正常退出或重新启动,而不会在调试 session 期间进程崩溃。

我正在考虑简单地永久删除对 Dispose 的调用,但我不确定后果,应用程序关闭是否会不可避免地导致容器被处置?

如果不建议删除对 dispose 的调用,那么唯一的选择是找到真正的原因,我认为这是容器本身的循环依赖,但我找不到它,我应该如何调试这个问题?

最佳答案

stackoverflow 的原因是对 UnityContainer 的 Dispose 的无限递归调用,我认为这是(奇怪的)由自动注册的 IUnityContainer 引起的,它不受我们的代码管理,应该在统一库中处理。我能够简单地通过将 UnityContainer 类的使用替换为重写 Dispose 并在递归调用中返回的派生类来停止无限递归:

public class CustomUnityContainer : UnityContainer
{

    private bool inDispose = false;

    protected override void Dispose(bool disposing)
    {
        if (inDispose) //prevents recursive calls into Dispose
            return;

        inDispose = true;

        base.Dispose(disposing);

        inDispose = false;

    }
}

关于asp.net-mvc - 我真的需要在关闭应用程序时处理 IUnityContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32720092/

相关文章:

asp.net-mvc-3 - 使用 Unity 容器时,没有为此对象定义无参数构造函数异常

asp.net - Windbg 和 Stack Overflow 异常 - 获得故障转储,但 Windbg 输出毫无意义

c++ - "Recursive on All Control Paths"执行阶乘函数时出错

asp.net-mvc - EF Core 3.1 是否支持 DB First 方法?

c# - ASP.NET MVC 中的 Task.Run 与 ContinueWith

jquery - 如何在我的网站上可靠地预加载和缓存我的 ajax 加载图像?

c# - 使用 jQuery Ajax 将对象列表传递给 ActionResult MVC Controller 方法

C# :Unity container and ILogger

c# - 如何彻底解决IoC循环引用?

c - gdb 堆栈溢出