我有一个 .net4 Web 应用程序在 64 位 2008 服务器中运行。只有当我将应用程序池设置为启用 32 位应用程序为 true 时,我才能让它运行。所有 dll 都是为 .net4 编译的(已使用 corflags.exe 验证)。我如何才能弄清楚为什么需要启用 32 位?
作为 64 位应用程序池启动时事件日志中的错误消息
事件代码:3008 事件消息:发生配置错误。 事件时间:2011-03-16 08:55:46 事件时间 (UTC):2011-03-16 07:55:46 事件 ID:3c209480ff1c4495bede2e26924be46a 事件序列:1 事件发生:1 事件详细信息代码:0
应用程序信息:应用程序域:已删除信任级别:完整应用程序虚拟路径:已删除应用程序路径:已删除机器名称:NMLABB-EXT01
进程信息:进程ID:4324 进程名称:w3wp.exe 帐户名称:removed
异常信息:异常类型:ConfigurationErrorsException 异常消息:无法加载文件或程序集“System.Data”或其依赖项之一。尝试加载格式不正确的程序。在 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) 在 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() 在 System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() 在 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) 在 System.Web.Compilation.BuildManager.CallPreStartInitMethods() 在 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)
无法加载文件或程序集“System.Data”或其依赖项之一。尝试加载格式不正确的程序。在 System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName、String codeBase、Evidence assemblySecurity、RuntimeAssembly locationHint、StackCrawlMark& stackMark、Boolean throwOnFileNotFound、Boolean forIntrospection、Boolean suppressSecurityChecks)在 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef、Evidence assemblySecurity、StackCrawlMark& stackMark、Boolean forIntrospection、Boolean suppressSecurityChecks)在 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString、Evidence assemblySecurity、StackCrawlMark& stackMark、Boolean forIntrospection)在 System.Reflection.Assembly.Load(String assemblyString)在 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName,Boolean星指令)
请求信息: 请求URL:“our url” 请求路径:“url” 用户主机地址:ip-addaddress 用户:
是否经过身份验证:False 身份验证类型:
线程 账户名:“app-pool”线程信息:线程 ID:6 线程帐户名称:“app-pool”是否正在模拟:False 堆栈跟踪:在 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName,Boolean starDirective)在 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()在 System.Web.Configuration.AssemblyInfo.get_AssemblyInternal()在 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)在 System.Web.Compilation.BuildManager.CallPreStartInitMethods()在 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,HostingEnvironmentParameters hostingParameters,PolicyLevel policyLevel,Exception appDomainCreationException)
自定义事件详细信息:
答案1
最有可能的原因是您的应用程序使用的一个或多个组件是 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>
仅当 something32.dll 位于 Program files (x86) 中时才会起作用。
如果是模块或处理程序加载失败,事件日志应该可以帮助您追踪哪个模块出现问题。
如果您的模块或处理程序未指定位数前提条件,并且由于重定向从不同的位数运行时可能会使用不同的路径,那么您就会遇到问题。(事件日志通常会指出当应用程序池无法启动时加载失败的原因)。
也可以看看: