英文:
ASP.NET Core 2.1 - Stack overflow exception related to dependency injection
问题
我在加载4或5次简单控制器操作后出现堆栈溢出异常。Web应用程序正在Azure上运行,我能够转储异常信息,问题似乎与依赖注入相关。
internal object GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
{
    if (_disposed)
    {
        ThrowHelper.ThrowObjectDisposedException(); --> 这被执行
    }
    var realizedService = RealizedServices.GetOrAdd(serviceType, _createServiceAccessor);
    _callback?.OnResolve(serviceType, serviceProviderEngineScope);
    return realizedService.Invoke(serviceProviderEngineScope);
}
在我的计算机上运行Web应用程序没有问题,只有在生产环境中失败。
这是我在Azure中捕获异常的方式:https://blogs.msdn.microsoft.com/benjaminperkins/2017/06/28/capture-a-stackoverflowexception-and-make-a-dump-0xc00000fd/
我在Visual Studio中打开了转储文件,并且能够识别出出错的代码行(如上所述),但我仍然不知道如何修复它。我的所有依赖项都使用“scope”生命周期解析。
感谢任何帮助。
英文:
I'm getting a stack overflow exception after I load 4 or 5 times a simple controller action. The web app is running on Azure and I was able to dump the exception information and the problem seems to be related to Dependency Injection.
    internal object GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
    {
        if (_disposed)
        {
            ThrowHelper.ThrowObjectDisposedException(); --> this is executed
        }
        var realizedService = RealizedServices.GetOrAdd(serviceType, _createServiceAccessor);
        _callback?.OnResolve(serviceType, serviceProviderEngineScope);
        return realizedService.Invoke(serviceProviderEngineScope);
    }
Running the web app in my computer has no issues, it only fails in PROD.
This is how I captured the exception in Azure: https://blogs.msdn.microsoft.com/benjaminperkins/2017/06/28/capture-a-stackoverflowexception-and-make-a-dump-0xc00000fd/
I opened the dump in Visual Studio and I could identify the code line where it failed (described above) but I still don't know how to fix it. All my dependencies are resolved with 'scope' lifetime.
Any help is appreciated.
答案1
得分: 3
我终于修好了!我有一个类,有大约20个依赖项,每个依赖项都有更多的依赖项,可能有4或5个级别。没有循环依赖,因为在我的开发环境中一切都正常工作。在我进行了重构并减少了依赖项之后,它就正常了。
因为在我的开发环境中一切都正常,但在Azure App Service中不正常,我认为在应用程序托管在Azure时,可能存在某种限制,限制了你可以定义的依赖项实例或级别。
这是我修复它的方法:
- 
找到失败的最简单情况。
 - 
注释掉所有依赖项,然后再次尝试。它起作用了,好吧,问题在于依赖项。
 - 
在生产环境中转储堆栈溢出异常,因为这个错误在开发环境中没有发生。
 - 
确认这是一个依赖注入问题,并检查.NET Core源代码。
 - 
减少依赖项实例和级别。
 - 
部署。如果不起作用,返回步骤(5)。如果起作用,你就开心了

 
几周后,我遇到了更多的问题,最后决定迁移到AutoFac。从那时起,一切都运行得很完美。AutoFac比内置的依赖注入要成熟得多。
英文:
I finally fixed it! I had a class that had like 20 dependencies and each dependency had more dependencies, maybe 4 or 5 level. There were no circular dependencies because this was working fine in my development environment. After I did a refactoring and reduced the dependencies, it worked out fine.
Because it was working fine in my development environment but not in Azure App Service, I assume there's some limitation on the dependency instances or levels you can define when the app is hosted in Azure.
This was my methodology to fix it:
- 
Find the simplest case that fails.
 - 
Comment out all the depedencies and try again. It worked, ok, it's about dependencies.
 - 
Dump the stack overflow exception in production as this error didn't occur in the dev environment.
 - 
Confirm it's a dependency injection issue and examine .NET Core source code.
 - 
Reduce dependency instances and levels.
 - 
Deploy. If it doesn't work, go to (5). If it works, you are happy again

 
A few weeks later I had more issues and I finally decided to migrate to AutoFac. It's been working perfectly since then. AutoFac is much more mature than the built-in dependency injection.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论