C# 实体框架在高容量IIS网站上运行时会失败吗

C# 实体框架在高容量IIS网站上运行时会失败吗,c#,multithreading,entity-framework,iis,objectcontext,C#,Multithreading,Entity Framework,Iis,Objectcontext,我们一直在尝试分析这一例外情况: 消息:错误:对象引用未设置为对象的实例。。 Stacktrace:at System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型、布尔publicOnly、布尔noCheck、布尔和canBeCached、, RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)位于 System.RuntimeType.CreateInstanceSlow(布

我们一直在尝试分析这一例外情况:

消息:错误:对象引用未设置为对象的实例。。 Stacktrace:at System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型、布尔publicOnly、布尔noCheck、布尔和canBeCached、, RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)位于 System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔型 skipCheckThis,布尔填充缓存)位于 System.RuntimeType.CreateInstanceDefaultCtor(仅限布尔值), 布尔skipVisibilityChecks,布尔skipCheckThis,布尔 位于System.Activator.CreateInstanceT的fillCache) Z.Services.ObjectContextManagement.ScopedObjectContextManager
1.get_ObjectContext()
at Z.Services.DatabaseAccess.DatabaseAccess
2.Manage()at Z.Services.DatabaseAccess.DatabaseAccess`2.get_ObjectContext()

基本上,我们在获取ObjectContext时会出错

从这个问题:我们看到EF依赖于保持在同一个线程上

从Jon Skeet对这个问题的回答来看:我们看到IIS具有线程敏捷性

当流量较低时,我们看不到此错误,但当负载增加时,我们会看到此错误

所以问题是:如果EF依赖于停留在单个线程上,而IIS没有将请求保持在单个线程上,那么EF可以用于部署在IIS上的应用程序吗

编辑

var frameworkAssembly = Assembly.GetAssembly(typeof(ObjectContextManager<>));
var managerType = frameworkAssembly.GetType(managerTypeName + "`1", true, true);
managerType = managerType.MakeGenericType(typeof(TObjectContext));
ObjectContextManager = Activator.CreateInstance(managerType) as ObjectContextManager<TObjectContext>;
var frameworkAssembly=Assembly.GetAssembly(typeof(ObjectContextManager));
var managerType=frameworkAssembly.GetType(managerTypeName+“`1”,true,true);
managerType=managerType.MakeGenericType(typeof(TObjectContext));
ObjectContextManager=Activator.CreateInstance(managerType)作为ObjectContextManager;
错误似乎发生在上述代码的最后一行。该错误仅发生在重载生产中

编辑2

ObjectContextManager继承自ObjectContext,后者是一个EF类

 public abstract class ObjectContextManager<T> where T : ObjectContext
公共抽象类ObjectContextManager,其中T:ObjectContext

我最近遇到了一些线程敏捷性和IIS方面的问题。IIS可以在请求通过管道时移动其线程。这并不意味着您必须更加注意并发性;重要的是上下文数据附加到线程的方式

在ASP.NET环境中,此存储通过
HttpContent.Current
变量完成,该变量保存当前线程上正在处理的当前请求的详细信息。它通过
System.Runtime.Remoting.Messaging.CallContext.HostContext
变量实现这一点

许多用于保持每个线程的数据的解决方案都使用了
ThreadStatic
属性,但是在ASP环境中由于线程切换而失败。线程static从value开始,然后在处理管道的中途变为
null

ASP.NET将跟踪
HttpContext
CurrentPrincipal
,还可能跟踪区域设置
CallContext
数据和存储在
ThreadStatic
变量中的数据不会被复制

答案虽然令人恼火,但却是更改策略并使用
HttpContext.Current.Items
而不是
CallContext
或线程静态

在您的情况下,检查EF使用的策略,并查看实现是否可插拔


正如Jon Skeet所指出的,上有更多信息,但更多地将其用作发现的启动平台,而不是其本身的目的。

鉴于EF部署在许多网站上没有出现问题,您应该检查自己做错了什么。你能显示出有问题的代码吗?@PanagiotisKanavos谢谢你的评论,我已经更新了问题,这不是EF代码。这是关于Activator无法创建类型的。您确定managerType不为null吗?顺便问一下,什么是ObjectContextManager?为什么要创建这样的类?为什么不把上下文类型作为类型参数传递呢?我不明白“线程敏捷性”是什么意思。我需要关心吗?我希望IIS必须管理这样的线程更改,而不需要我编写任何同步程序。可怕的是,如果您的问题确实是由IIS基础设施引起的……EF不是线程安全的,这意味着您不能在多个线程中使用同一个ObjectContext实例(或ObjectStateManager等其他常见EF对象)。但是,如果您为每个线程创建一个单独的ObjectContext实例,您就可以了。正如之前有人指出的,无论是在堆栈跟踪中还是在示例中,您都没有使用属于EF的任何内容。