У меня есть веб-приложение .net4, работающее на 64-битном сервере 2008 года. Я могу запустить его только тогда, когда я установил для пула приложений значение Включить 32-битное приложение в значение true. Все dll скомпилированы для .net4 (проверено с помощью corflags.exe). Как я могу понять, почему требуется Enable 32-bit?
Сообщение об ошибке из журнала событий при запуске как 64-битный пул приложений
Код события: 3008 Сообщение о событии: Произошла ошибка конфигурации. Время события: 2011-03-16 08:55:46 Время события (UTC): 2011-03-16 07:55:46 Идентификатор события: 3c209480ff1c4495bede2e26924be46a Последовательность событий: 1 Возникновение события: 1 Детальный код события: 0
Информация о приложении: Домен приложения: удален. Уровень доверия: Полный. Виртуальный путь приложения: удален. Путь приложения: удален. Имя компьютера: NMLABB-EXT01.
Информация о процессе: ID процесса: 4324 Имя процесса: w3wp.exe Имя учетной записи: удалено
Информация об исключении: Тип исключения: ConfigurationErrorsException Сообщение об исключении: не удалось загрузить файл или сборку System.Data или одну из ее зависимостей. Была сделана попытка загрузить программу с неправильным форматом. в System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) в System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () в System.Web.Configuration.AssemblyInfo.get_Assembly.AssemblyInfo.get_Assembly. GetReferencedAssemblies (CompilationSection compConfig) в System.Web.Compilation.BuildManager.CallPreStartInitMethods () в System.Web.Hosting.HostingEnvironment.Initialize (ApplicationManager appManager, IApplicationHost appHost, PolicyFigExceptionMapmeters, PolicyFigExceptionPathmeters, политика хостинга)
Не удалось загрузить файл или сборку System.Data или одну из ее зависимостей. Была сделана попытка загрузить программу с неправильным форматом. в System.Reflection.RuntimeAssembly._nLoad (AssemblyName имя_файла, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark и stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityCurityChelection.AssemblyNameStackModelModel, StackModelModel.Management.ModelStackManagement.Management.AssemblyInternetRefenderModelManagement, StackModelModelModel.Management, BuleansuppressSecurity.ModelSecurityChelection. , Boolean forIntrospection, Boolean suppressSecurityChecks) в System.Reflection.RuntimeAssembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) в System.Reflection.AssemblyLoadSystem.Conflection.Строка сборки.Строка сборки.Строка сборки. (String AssemblyName, логическое starDirective)
Информация для запроса: URL-адрес запроса: "наш url" Путь запроса: "url" Адрес хоста пользователя: ip-adddress Пользователь:
Проверено: ложный тип аутентификации:
Имя учетной записи потока: "app-pool"Информация о потоке: ID потока: 6 Имя учетной записи потока: "app-pool" Выдает себя за: False Трассировка стека: в System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String AssemblyName, Boolean starDirective) в System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBrom () в System.Web.Configuration.AssemblyInfo.get_AssemblyInternal () в System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) в System.Web.Compilation.BuildManager.CallPreStartInitMethods () в System.Web.InteriorHithods () (ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)
Детали настраиваемого события:
Скорее всего, потому что один или несколько компонентов, используемых вашим приложением, 32-разрядные.
Или потому, что один или несколько компонентов, используемых вашим приложением, не обнаруживаются при переключении режима пула приложений из-за их разрядности и перенаправления файловой системы.
Вообще говоря, IIS разделит модули и обработчики на 32- и 64-разрядные двоичные файлы и не позволит той или иной разрядности увидеть другую разрядность с предварительными условиями bitness32 или bitness64.
Пример заголовка:
<modules>
<module name="something" path="c:\program files\something.dll" precondition="bitness64">
</modules>
Если вы измените пул приложений на 32-битный, имейте в виду:
тот же модуль / обработчик может иметь такую запись:
<modules>
<module name="something32" path="c:\program files\something32.dll" precondition="bitness32">
</modules>
Это будет работать, только если что-то32.dll находится в программных файлах (x86).
Журналы событий должны помочь вам отследить, какой модуль вызывает проблемы, если это сбой загрузки модуля или обработчика.
Если ваши модули или обработчики не указывают предварительное условие разрядности и могут использовать разные пути при запуске с другой разрядностью из-за перенаправления, у вас есть проблема. (журналы событий обычно указывают на то, что не удалось загрузить, когда пул приложений не запускается).
Смотрите также: