【问题标题】:Intermittent Could not load file or assembly / PolicyExceptions间歇性无法加载文件或程序集/PolicyExceptions
【发布时间】:2010-06-04 10:56:20
【问题描述】:

我们会间歇性地从 .NET 3.5 Web 应用程序中收到类似的错误:

Exception:
System.Configuration.ConfigurationErrorsException: Could not load file or assembly 'itextsharp, Version=4.1.2.0, Culture=neutral, PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418) (C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config\web.config line 59) ---> System.IO.FileLoadException: Could not load file or assembly 'itextsharp, Version=4.1.2.0, Culture=neutral, PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418) File name: 'itextsharp, Version=4.1.2.0, Culture=neutral, PublicKeyToken=8354ae6d2174ddca' ---> System.Security.Policy.PolicyException: Execution permission cannot be acquired.
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Boolean checkExecutionPermission)
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Int32& securitySpecialFlags, Boolean checkExecutionPermission)
   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)


   --- End of inner exception stack trace ---
   at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)
   at System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()
   at System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai)
   at System.Web.Configuration.AssemblyInfo.get_AssemblyInternal()
   at System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)
   at System.Web.Compilation.WebDirectoryBatchCompiler..ctor(VirtualDirectory vdir)
   at System.Web.Compilation.BuildManager.BatchCompileWebDirectoryInternal(VirtualDirectory vdir, Boolean ignoreErrors)
   at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
   at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert)
   at System.Web.Compilation.BuildManager.GetCompiledType(String virtualPath)
   at System.Web.Script.Services.WebServiceData.GetWebServiceData(HttpContext context, String virtualPath, Boolean failIfNoData, Boolean pageMethods, Boolean inlineScript)
   at System.Web.Script.Services.RestHandler.CreateHandler(HttpContext context)
   at System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated)
   at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Inner exception:
System.IO.FileLoadException: Could not load file or assembly 'itextsharp, Version=4.1.2.0, Culture=neutral, PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418) File name: 'itextsharp, Version=4.1.2.0, Culture=neutral, PublicKeyToken=8354ae6d2174ddca' ---> System.Security.Policy.PolicyException: Execution permission cannot be acquired.
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Boolean checkExecutionPermission)
   at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Int32& securitySpecialFlags, Boolean checkExecutionPermission)
   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)

web.config 第 59 行是:

<add assembly="*"/>

当这些发生时,网站将 YSOD 直到我们回收应用程序池。这些站点可能会在此发生之前运行数天/数周,或者可能在一小时内发生两次。我无法确定这与我们系统中的任何特定请求/功能有关。

在这种情况下,它指向 itextsharp,但它随机指向我们的应用程序引用的任何程序集,包括内部和外部。

运行 caspol 验证 DLL 是否具有完全信任权限:

C:\Windows\Microsoft.NET\Framework64\v2.0.50727>caspol -rsg D:\...\bin\itextsharp.dll
Microsoft (R) .NET Framework CasPol 2.0.50727.3053
Copyright (c) Microsoft Corporation.  All rights reserved.

Level = Enterprise

Code Groups:

1.  All code: FullTrust


Level = Machine

Code Groups:

1.  All code: Nothing
   1.1.  Zone - MyComputer: FullTrust


Level = User

Code Groups:

1.  All code: FullTrust

Success

我们的应用程序在三台服务器上运行,其中两台在 Server 2008 Web x64 上,第三台在 Server 2008 R2 Web x64 上运行,都安装了 .NET 3.5,没有安装 .NET 4.0。

问题仅在运行 2008 非 R2 的前两个上出现

在所有三台服务器上运行 depends.exe 会为非 R2 服务器提供相同的结果:

  • 我的 DLL 显示为 x86(编译为 AnyCPU,在 x64 w3wp 中运行),所有其他模块显示为 x64。
  • 缺少 IESHIMS.DLL 和 LINKINFO.DLL - 根据 Google 的说法,这两个似乎都是红鲱鱼。

第三台服务器显示相同,除了它没有错过 LINKINFO.DLL

所有服务器都在已被授予必要权限的自定义域帐户下运行 IIS7(R2 为 7.5):

aspnet_regiis -ga [user]

加载用户配置文件在所有三台服务器上都设置为 false。根据以下内容,我已尝试在其中一台故障服务器上将其设置为 true: IIS7 Failed to grant minimum permission requests

通过运行 processmonitor,我可以看到它现在使用 C:\Users\TEMP\AppData\Local\Temp 目录来存储各种临时文件 - 其他的没有使用任何这样的目录。到目前为止,我会让它以这种方式运行,看看这是否会改变任何东西。但是,鉴于第三台服务器没有出现问题,我对此表示怀疑,但仍然将“加载用户配置文件”设置为相同的值,即 false。

我还尝试在所有三台服务器上运行 Fuslogvw,将绑定失败记录到磁盘。所有三台服务器都报告了相同的 VJSharpCodeProvider 和 CppCodeProvider 绑定错误,但这些似乎也很正常,可以通过在构建期间不定义 DEBUG 和 TRACE 常量来解决。

我们在每台服务器上运行大约 500 个网站(相同,负载平衡),其中 50 个处于中等负载下,但是在高负载和最小负载下都会出现问题。

现在我正在等待错误再次发生,以便我希望看到一种模式并确定“加载用户配置文件”是否可以缓解问题。在此期间任何建议都将非常受欢迎!另外,我不明白缺少“加载用户配置文件”会如何导致这样的问题?更进一步,它看起来如何在 R2 上运行,但在普通 2008 上却不行?

谢谢!

【问题讨论】:

    标签: asp.net iis-7 windows-server-2008


    【解决方案1】:

    可能是运行时如何定位程序集及其对负载平衡环境的影响的问题。

    您可以尝试使用&lt;probing&gt; 元素指定从何处检索程序集。

    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <probing privatePath="bin;bin2\subbin;bin3"/>
          </assemblyBinding>
       </runtime>
    </configuration>
    

    编辑:

    试试这个:

    <configuration>
       <runtime>
          <disableCachingBindingFailures enabled="1" />
       </runtime>
    </configuration>
    

    【讨论】:

    • 内容服务器不知道负载均衡,因此负载均衡无法解决问题。所有程序集都是从 bin 目录加载的,实际上不需要添加一个探测元素来告诉运行时在 bin 目录中查找。除了系统程序集之外,也没有从 GAC 加载任何内容,仅从 bin 目录加载。此外,如果是因为运行时无法找到 DLL,fuslogvw 应该显示一个日志条目。
    • 好吧,我想您可以尝试禁用由于从缓存中绑定程序集而导致的失败。发生此错误后的不间断 YSOD 看起来是因为在查找程序集时,如果先前的加载导致失败,那么将发生另一个失败,而没有任何尝试加载程序集。见编辑。它可能无法阻止第一次失败,但它可能是阻止后续失败的诀窍。
    • 根据文档,disableCachingBindingFailures 设置只会影响与加载程序集相关的 FileNotFoundExceptions。在我收到的所有错误中,没有一个指向未找到程序集,而是失败并出现 FileLoadException(文档提到的总是缓存,无论 disableCachingBindingFailures 设置如何)。我认为这个问题与安全有关,而不是定位和加载程序集文件的问题——因此缺少 fuslogvw 条目。
    猜你喜欢
    • 2013-02-14
    • 2020-08-17
    相关资源
    最近更新 更多