Назад | Перейти на главную страницу

Почему в IIS7.5 для моего приложения требуется 32-разрядный режим?

У меня есть веб-приложение .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-битный, имейте в виду:

  • bitness64 не будет правдой
  • 64-битные приложения не лгут о расположении файлов; 32-битные приложения могут быть (Program Files (x86) или System32 (который перенаправляет на SysWow64))

тот же модуль / обработчик может иметь такую ​​запись:

<modules> <module name="something32" path="c:\program files\something32.dll" precondition="bitness32"> </modules>

Это будет работать, только если что-то32.dll находится в программных файлах (x86).

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

Если ваши модули или обработчики не указывают предварительное условие разрядности и могут использовать разные пути при запуске с другой разрядностью из-за перенаправления, у вас есть проблема. (журналы событий обычно указывают на то, что не удалось загрузить, когда пул приложений не запускается).

Смотрите также: