我在IIS 7.5上托管的ASP.NET MVC应用程序出现问题,该应用程序池使用AppPoolIdentity和.NET 4.0 Framework进行配置。
应用程序正常工作一段时间后突然部分控制器开始在StructureMap内抛出异常:
System.ArgumentNullException
:正在尝试 找到[MyType
]类型的实例 参数名称:instance
在
StructureMap.InstanceCache.Get(Type pluginType, Instance instance) +376
请求的类型已正确注册(并在发生异常前一分钟正确解析)。我无法验证它是否仍然已注册,因为 WhatDoIHave
也会引发异常:
NullReferenceException
:对象 引用未设置为的实例 宾语。在StructureMap.Diagnostics.WhatDoIHaveWriter.writeInstance(InstanceRef instance) +133
看起来StructureMap的内部缓存会以某种方式损坏。
当我将AppPoolIdentity更改为“真正的”本地系统用户凭据时,问题消失。所以看起来问题出在IIS和StructureMap之间。也许应用池回收会在这里产生问题?但它配置为每1740分钟回收一次,有时在开始5分钟后失败......
答案 0 :(得分:0)
嗯,问题似乎非常不同,我不知道它与应用程序池和权限的关联方式。
缺陷在GetNamedInstance<T>
StructureMap的容器方法中。我请求一个未注册的命名实例,StructureMap尝试创建实例并将其添加到容器中。创建失败,但是,StructureMap在容器中注册null
。遇到此null
时,该命名实例的每个后续请求都会失败。
我们的解决方法是,我们使用GetAllInstances<T>
代替GetNamedInstance<T>
,并手动迭代T
的所有实例以查找匹配的实例。