После развертывания веб-приложения ASP.NET 4 на сервере IIS6 рабочий процесс перезагружается, и в большинстве случаев он перестает работать - PullRequest
2 голосов
/ 08 июля 2010

Это действительно странная ситуация, поэтому, надеюсь, я смогу объяснить ее достаточно хорошо.

Я развертываю приложение веб-форм 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.

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Убедитесь, что у вас нет другого сайта ASP.NET, созданного для более низкой версии (<4.0), работающей в том же пуле приложений. Как и в ASP.NET 1.1 и 2.0, ASP.NET 4.0 не может одновременно находиться в одном рабочем процессе с другими версиями. </p>

Обновление

Я не уловил ту часть исключения, которая сообщает об этом, потому что она была вне поля зрения:

Exception message: Unable to load one or more of the requested types.<br> 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 и содержит массив исключений, создаваемых загрузчиком классов.

Это должно помочь вам сузить круг вопросов, если нет, то опубликуйте список исключений, которые вы там найдете.

0 голосов
/ 28 июля 2010

У нас была похожая проблема, и мы решили ее, убедившись, что все проекты, на которые ссылался проект, выдавший ошибку, ссылались на одни и те же версии DLL.проект A вызывал эту ошибку, а проект A ссылался на версию dll 2. Проект A также ссылался на проект B, который сам ссылался на версию dll 1. версия 2 dll перезаписывалась версией 1 из проекта B.был изменен в проекте b, проект a работал так, как должен.

0 голосов
/ 27 июля 2010

Вот обновление этой ужасной ошибки - я развертывал элемент управления ReportViewer и ссылался на пару dll, требуемых в моем проекте, с копией local = true.Кажется, что вам нужно установить Redist ReportViewer на сервере, или вы получите странное поведение, подобное этой проблеме, которая, очевидно, не имеет ничего общего с EntityDataSource.

Короче говоря, я исправил это, установив Redist ReportViewer 10 на сервере вместо того, чтобы просто копировать dll в bin.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...