Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 5 MVC WebApi项目中SimpleInjector内部的StackOverflowException_Asp.net Mvc 5_Entity Framework 6_Stack Overflow_Asp.net Web Api2_Simple Injector - Fatal编程技术网

Asp.net mvc 5 MVC WebApi项目中SimpleInjector内部的StackOverflowException

Asp.net mvc 5 MVC WebApi项目中SimpleInjector内部的StackOverflowException,asp.net-mvc-5,entity-framework-6,stack-overflow,asp.net-web-api2,simple-injector,Asp.net Mvc 5,Entity Framework 6,Stack Overflow,Asp.net Web Api2,Simple Injector,我们正在构建一个包含UI和API的网站,它们都托管在单个ASP.NET MVC项目中(“通常的”MVC+MVC WebApi)。我们正在使用SimpleInjector(最新版本,目前为2.8)进行依赖项注入。我们有一个组合根类来为UI和API部件构造容器 最近(几周前注意到),当我们尝试访问QA中的任何API方法时,我们收到连接重置错误(ERR\u connection\u reset)。UAT中的相同代码工作正常 在本地,如果在IIS下运行,StackOverflowException会出现

我们正在构建一个包含UI和API的网站,它们都托管在单个ASP.NET MVC项目中(“通常的”MVC+MVC WebApi)。我们正在使用SimpleInjector(最新版本,目前为2.8)进行依赖项注入。我们有一个组合根类来为UI和API部件构造容器

最近(几周前注意到),当我们尝试访问QA中的任何API方法时,我们收到连接重置错误(
ERR\u connection\u reset
)。UAT中的相同代码工作正常

在本地,如果在IIS下运行,
StackOverflowException
会出现相同的代码错误,但是如果在IIS Express下运行,并且在IIS下运行时附加了调试器,则可以正常工作

在异常发生后连接到iis工作进程时,我们当前的代码提供以下堆栈跟踪:

    SimpleInjector.Compiled!DynamicInstanceProducer3.GetInstance(object[] constants)
    SimpleInjector.dll!SimpleInjector.CompilationHelpers.CompileInDynamicAssemblyAsClosure<System.__Canon>.AnonymousMethod__1a()
    SimpleInjector.dll!SimpleInjector.InstanceProducer.GetInstance()
    SimpleInjector.dll!SimpleInjector.Container.GetInstance(System.Type serviceType)
    System.Web.Http.dll!System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(System.Net.Http.HttpRequestMessage request, System.Type controllerType, out System.Func<System.Web.Http.Controllers.IHttpController> activator)
    System.Web.Http.dll!System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(System.Net.Http.HttpRequestMessage request, System.Web.Http.Controllers.HttpControllerDescriptor controllerDescriptor, System.Type controllerType)
    System.Web.Http.dll!System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(System.Net.Http.HttpRequestMessage request)
    System.Web.Http.dll!System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync()
    mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start<System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync>(ref System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync stateMachine)
    System.Web.Http.dll!System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    System.Net.Http.dll!System.Net.Http.HttpMessageInvoker.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    System.Web.Http.dll!System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    System.Web.Http.dll!System.Web.Http.HttpServer.SendAsync()
    mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start<System.Web.Http.HttpServer.SendAsync>(ref System.Web.Http.HttpServer.SendAsync stateMachine)
    System.Web.Http.dll!System.Web.Http.HttpServer.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    System.Net.Http.dll!System.Net.Http.HttpMessageInvoker.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    System.Web.Http.WebHost.dll!System.Web.Http.WebHost.HttpControllerHandler.ProcessRequestAsyncCore()
    mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start<System.Web.Http.WebHost.HttpControllerHandler.ProcessRequestAsyncCore>(ref System.Web.Http.WebHost.HttpControllerHandler.ProcessRequestAsyncCore stateMachine)
    System.Web.Http.WebHost.dll!System.Web.Http.WebHost.HttpControllerHandler.ProcessRequestAsyncCore(System.Web.HttpContextBase contextBase)
    System.Web.dll!System.Web.TaskAsyncHelper.BeginTask(System.Func<System.Threading.Tasks.Task> taskFunc, System.AsyncCallback callback, object state)
    System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
    System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step, ref bool completedSynchronously)
    System.Web.dll!System.Web.HttpApplication.PipelineStepManager.ResumeSteps(System.Exception error)
    System.Web.dll!System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext context, System.AsyncCallback cb)
    System.Web.dll!System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest wr, System.Web.HttpContext context)
    System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags)
    System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags)
    [Native to Managed Transition]  
    [Managed to Native Transition]  
    System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags)
    System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags)
    [AppDomain Transition]  
有趣的是,它不再建议使用旧代码附加到流程,因此我无法提供堆栈跟踪-如果我设法抓住它,我将更新问题

请注意,通常的MVC仍然正常工作(同时使用相同的组合根类,WebApi和MVC创建模式有细微的自然差异)

如果合理的话,我可以提供更多的代码片段,但是这个项目相当大,所以我不确定小片段在这里是否有用

你知道这是什么吗?这可能是因为依赖关系的数量吗

更新:在依赖于其他四个服务的其中一个服务中,我从构造函数中删除了依赖项,将容器注入其中,并在构造函数中手动解决了依赖项,之后问题就不会出现了。也就是说,它是:

public MyDependentService(IDependency1 dependency1, IDependency2 dependency2, IDependency3 dependency3, IDependency4 dependency4)
{
    this.dependency1 = dependency1;
    this.dependency2 = dependency2;
    this.dependency3 = dependency3;
    this.dependency4 = dependency4;
}
它变成了

public MyDependentService(Container container)
{
    this.dependency1 = container.GetInstance<IDependency1>();
    this.dependency2 = container.GetInstance<IDependency2>();
    this.dependency3 = container.GetInstance<IDependency3>();
    this.dependency4 = container.GetInstance<IDependency4>();
}
公共MyDependentService(容器)
{
this.dependency1=container.GetInstance();
this.dependency2=container.GetInstance();
this.dependency3=container.GetInstance();
this.dependency4=container.GetInstance();
}

所以现在一切都正常了,但这当然不是处理依赖关系的正确方法。这实际上已经不是国际奥委会了。发生了什么?

注册中的依赖项数量不会导致堆栈溢出,Simple Injector通常会检测循环依赖关系图(以防止发生堆栈溢出异常)。@Steven,这就是我所依赖的,事实上已经见过几次循环依赖关系异常,当代码中确实存在循环依赖时。当然,这些异常是独立于环境出现的(IIS、IIS express、附加或不附加调试器等)。@Steven请查看更新。奇怪,不是吗?我认为依赖性的数量可能是这里的关键。堆栈溢出的一般原因是什么?最明显的是递归太深,这在stacktrace中很明显(除非SimpleInjector.Compiled!DynamicInstanceProducer3.GetInstance(对象[]常量)中隐藏了某些内容)。还有什么?我的内部功能可能不够强大,但这是否可能是因为GetInstance接收的对象数组可能很大,从而在堆栈中占用了太多空间?此数组大小是否与依赖项的数量相关?
var result=Analyzer.Analyze(container)
是否触发异常?您可能在Simple Injector中遇到了错误。你有没有可能想出一个重现这个问题的小例子。最好为此创建一个Github问题,因为SO并不真正适用于此。
public MyDependentService(Container container)
{
    this.dependency1 = container.GetInstance<IDependency1>();
    this.dependency2 = container.GetInstance<IDependency2>();
    this.dependency3 = container.GetInstance<IDependency3>();
    this.dependency4 = container.GetInstance<IDependency4>();
}