Это действительно странная ситуация, поэтому, надеюсь, я смогу объяснить ее достаточно хорошо.
Я развертываю приложение веб-форм ASP.NET 4 на сервере Windows Server 2003 с пакетом обновления 2 (SP2) под управлением IIS6.
Вот проблема - когда пул приложений перезагружает свой рабочий процесс (w3wp.exe), примерно в 80% случаев я получаю ошибку ReflectionTypeLoadException при попытке доступа к любой странице в приложении, которая содержит EntityDataSoureкаждый раз, когда я пытаюсь просмотреть его.
Однако (это интересная часть) - остальные 20%, это работает просто отлично.На самом деле я прибег к отключению повторного использования рабочего процесса полностью для этого пула приложений и просто добавляю / удаляю пробелы из web.config, заставляя сайт перекомпилироваться, пока не получу «хороший» w3wp.exe.
Еслиэто не ясно, что я говорю: фактический рабочий процесс вообще не работает для страниц, содержащих EntityDataSource, примерно в 4/5 раз, когда он запускается, но все же удается нормально обслуживать все другие страницы.Как только вы получаете рабочий процесс, который обрабатывает страницу с EntityDataSource, он работает каждый раз, пока этот процесс не будет переработан.
Мой вопрос: как я могу отладить это?Он отлично работает на моем компьютере разработчика, он отлично работает на сервере, пока вы запускаете хороший процесс, но 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.