Прерывистый Не удалось загрузить файл или сборку / PolicyExceptions - PullRequest
1 голос
/ 04 июня 2010

Периодически мы будем получать подобные ошибки из наших веб-приложений .NET 3.5:

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)

строка 59 файла web.config:

<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.

Выполнение зависимости.exe на всех трех серверах дает одинаковые результаты для серверов, не относящихся к R2:

  • Моя DLL показана как x86 (скомпилирована как AnyCPU, работает в x64 w3wp), все остальные модули отображаются как x64.
  • Отсутствуют IESHIMS.DLL и LINKINFO.DLL - по словам Google, обе они кажутся красными сельдями.

Третий сервер показывает то же самое, за исключением того, что не пропускает LINKINFO.DLL

Все серверы работают под управлением IIS7 (7.5 для R2) под пользовательской учетной записью домена, которой предоставлены необходимые разрешения:

aspnet_regiis -ga [user]

Загрузка профиля пользователя установлена ​​на false на всех трех серверах. Я попытался установить это значение true на одном из неисправных серверов, в соответствии с: IIS7 Не удалось удовлетворить минимальные запросы на разрешение

Запустив processmonitor, я вижу, что теперь он использует каталог C: \ Users \ TEMP \ AppData \ Local \ Temp для различных временных файлов - другие не используют никаких таких каталогов. До сих пор я позволю этому запускаться таким образом, чтобы видеть, изменяет ли это что-нибудь. Я сомневаюсь, однако, учитывая, что третий сервер не обнаруживает проблемы, но все еще имеет "Загрузить профиль пользователя", установленное на то же значение, ложь.

Я также пытался запустить Fuslogvw на всех трех серверах, регистрируя ошибки привязки к диску. Все три сервера сообщают об одинаковых ошибках привязки для VJSharpCodeProvider и CppCodeProvider, но они также кажутся нормальными и могут быть решены путем отсутствия определения констант DEBUG и TRACE во время сборки.

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

Прямо сейчас я жду повторения ошибок, поэтому я надеюсь увидеть шаблон и определить, облегчает ли проблема «Загрузить профиль пользователя». Любые предложения тем временем будут очень приветствоваться! Кроме того, я не понимаю, как отсутствие «Загрузить профиль пользователя» может вызвать такую ​​проблему? И даже далее, как это будет работать на R2, а не на обычном 2008?

Спасибо!

1 Ответ

1 голос
/ 13 июня 2010

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

Вы можете попытаться указать, откуда извлекаются ваши сборки, используя элемент <probing>.

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

EDIT:

Попробуйте это:

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