将ASP.NET 4 Web应用程序部署到IIS6服务器之后,工作进程的回收使其大部分时间停止工作

这是一个非常奇怪的情况,所以希望我可以解释得很好。

我正在将ASP.NET 4 webforms应用程序部署到运行IIS6的Windows Server 2003 SP2服务器。

下面是问题 – 当应用程序池回收其工作进程(w3wp.exe),大约80%的时间,我会得到一个ReflectionTypeLoadException错误,试图访问应用程序中包含一个EntityDataSoure任何页面,每次我尝试查看它。

然而(这是有趣的部分) – 另外20%,它工作得很好。 我实际上采取了closures循环工作进程完全为这个应用程序池,只是添加/删除空白从web.config强制网站重新编译,直到我得到一个“好”w3wp.exe。

如果这不清楚,我说的是:实际工作进程不起作用的页面包含一个EntityDataSource大约4/5次开始,但仍然设法服务所有其他页面就好了。 一旦你得到一个工作进程,pipe理一个EntityDataSource的页面,它每一次工作,直到该进程得到回收。

我的问题是,我怎样才能debugging呢? 它在我的开发机器上工作正常,只要你得到一个好的进程运行,但它工作正常,但iisreset或服务器重新启动或杀死工作进程的任何东西几乎保证会导致该网站不能恢复和抛出这个ReflectionTypeLoadException。

这是我的web.config的编译部分:

<compilation debug="false" targetFramework="4.0"> <assemblies> <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> </assemblies> </compilation> 

这里是关于这个例外的所有信息:

 Application information: Application domain: /LM/W3SVC/1/Root/name-5-129230865053805490 Trust level: Full Process information: Process ID: 3300 Process name: w3wp.exe Account name: NT AUTHORITY\NETWORK SERVICE Exception information: Exception type: ReflectionTypeLoadException Exception message: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information. Thread information: Thread ID: 6 Thread account name: NT AUTHORITY\NETWORK SERVICE Is impersonating: False Stack trace: at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module) at System.Reflection.Assembly.GetTypes() at System.Data.Metadata.Edm.ObjectItemConventionAssemblyLoader.LoadTypesFromAssembly() at System.Data.Metadata.Edm.ObjectItemAssemblyLoader.Load() at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData) at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, KnownAssembliesSet knownAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage, Object& loaderCookie, Dictionary`2& typesInLoading, List`1& errors) at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage) at System.Data.Metadata.Edm.ObjectItemCollection.ExplicitLoadFromAssembly(Assembly assembly, EdmItemCollection edmItemCollection, Action`1 logLoadMessage) at System.Data.Metadata.Edm.MetadataWorkspace.ExplicitLoadFromAssembly(Assembly assembly, ObjectItemCollection collection, Action`1 logLoadMessage) at System.Web.UI.WebControls.EntityDataSourceView.ConstructContext() at System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) at System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e) at System.Web.UI.WebControls.ListControl.PerformSelect() at System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() at System.Web.UI.WebControls.ListControl.OnPreRender(EventArgs e) at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

项目中没有任何文件的变化,所以我不明白为什么有时我得到一个“好”w3wp.exe和其他时间,我得到一个“坏”w3wp.exe。

Solutions Collecting From Web of "将ASP.NET 4 Web应用程序部署到IIS6服务器之后,工作进程的回收使其大部分时间停止工作"

检查您是否没有针对在同一个应用程序池中运行的较低版本(<4.0)构建的另一个ASP.NET网站。 与ASP.NET 1.1和2.0一样,ASP.NET 4.0不能与其他版本共存于相同的工作进程中。

更新

我没有捕捉到这个报告的例外,因为它是不可见的:

Exception message: Unable to load one or more of the requested types.
Retrieve the LoaderExceptions property for more information.

^ ^ ^ look up, the framework is helping us for a change ^ ^ ^

你可以在你的代码中包装一个try / catch块吗?你会发现你找到的异常吗?

像下面的代码会这样做:

 try { //Do your entity data thing in the page... } catch(ReflectionTypeLoadException rtle) { foreach(Exception ex in rtle.LoaderExceptions) { Debug.WriteLine(ex.ToString()); } } 

LoaderExceptions是抛出的ReflectionTypeLoadException异常的成员,它包含由类加载器抛出的异常数组。

这应该可以帮助你缩小范围,如果不是的话,那么你可以在那里找到例外列表。

这里是关于这个可怕的错误的更新 – 我正在部署一个reportviewer控件,并引用我的项目中所需的几个dll copy local = true。 看起来你必须在服务器上安装ReportViewer redist,否则你会得到像这个问题一样的有趣的行为,毕竟这与EntityDataSource显然没有任何关系。

总之,我通过在服务器上安装ReportViewer 10 redist来解决这个问题,而不是仅仅将dll复制到bin中。

http://www.microsoft.com/downloads/details.aspx?FamilyID=a941c6b2-64dd-4d03-9ca7-4017a0d164fd&displaylang=en

我们遇到了一个类似的问题,通过确保项目引用错误的所有项目引用了相同版本的dll来解决这个问题。 即项目A是抛出这个错误,项目A引用DLL版本2.项目A也引用项目B,它本身引用DLL版本1.DLL的版本2被项目B的版本1覆盖。一旦参考在项目b中被更改,项目工作就像它应该。