Вскоре после перезагрузки пула приложений в приложении ASP.NET мы периодически видим следующее исключение:
System.Configuration.ConfigurationErrorsException: Could not load file or assembly 'Microsoft.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418) ---> System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418)
File name: 'Microsoft.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> 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)
Конкретная DLL, которая не загружается, варьируется от инцидента к инциденту, но на нее всегда ссылается основная сборка.
Мы работаем на ASP.NET 3.5 на Windows Server 2008. Похоже, это происходит в пакетном режиме, затрагивая некоторые, но не все сайты в одном пуле приложений. У нас большое количество сайтов, на которых используется один и тот же код.
Как только сайту не удалось загрузить DLL, он выбрасывает «Желтый экран смерти» до следующей перезагрузки пула приложений. Мы не смогли воспроизвести это поведение, и сайты, по-видимому, работают хорошо в течение нескольких дней или недель (и многие пулы приложений перезагружаются) до сбоя.
Кто-нибудь еще видел подобное поведение?
Обновление:
Мы попытались воспроизвести ошибку, настроив несколько сотен сайтов и написав сценарий для их повторного обращения при повторной переработке пула приложений раз в пару минут, и нам не удалось достичь чего-то большего, кроме загрузки ЦП сервера для несколько дней подряд.
Затем мы попытались связать (заблокировать одну из библиотек DLL, изменить права доступа к файлам) с копиями библиотек DLL, созданных ASP.NET, и им удалось воспроизвести подобное поведение, но не то же исключение.
Есть ли у кого-нибудь идеи о том, как настроить политику безопасности, чтобы она выдавала System.Security.Policy.PolicyException: Execution permission cannot be acquired.
при загрузке определенной DLL?