Às vezes, os aplicativos asp.net que escrevemos são executados em hosts virtuais. Alguns hosts virtuais podem ter definido permissões no asp.net devido a considerações de segurança, o que fará com que nossos aplicativos não funcionem corretamente.
Sintomas do problema:
Por algum motivo, o asp.net não consegue carregar alguns arquivos dll e a seguinte mensagem de erro aparece: Erro de servidor no aplicativo '/'.
------------------------------------------------------------
As permissões necessárias não podem ser adquiridas .
Descrição: ocorreu uma exceção não tratada durante a execução da solicitação da Web atual. Revise o rastreamento de pilha para obter mais informações sobre o erro e sua origem no código.
Detalhes da exceção: System.Security.Policy.PolicyException: as permissões necessárias não podem ser adquiridas. .
Erro
de origem:
uma exceção não tratada foi gerada durante a execução da solicitação da web atual. As informações sobre a origem e o local da exceção podem ser identificadas usando o rastreamento de pilha de exceções abaixo.
[PolicyException: As permissões necessárias não podem ser adquiridas.]
System.Security.SecurityManager.ResolvePolicy (Evidência, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& negado, booleano checkExecutionPermission) +2738293
System.Security.SecurityManager.ResolvePolicy (Evidência, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& negado, Int32& securitySpecialFlags, Boolean checkExecutionPermission) +57
[FileLoadException: Não foi possível carregar o arquivo ou assembly 'Microsoft.Practices.ObjectBuilder, Versão = 1.0 .51205.0, Culture=neutral, PublicKeyToken=null' ou uma de suas dependências Falha ao conceder solicitações de permissão mínima (Exceção de HRESULT: 0x80131417)]
System.Reflection.Assembly.nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark e stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark e stackMark, Boolean forIntrospection) +211
System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark e stackMark, Boolean forIntrospection) +141
System.Reflection.Assembly.Load(String assemblyString) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +32
Análise do problema:
De acordo com minha observação, a dll gerada diretamente pelo aplicativo asp.net pode ser carregada normalmente, e a dll externa chamada diretamente pelo asp.net também pode ser carregada normalmente, mas outras dlls externas que são referenciadas apenas pela dll externa não podem ser carregado. Meu palpite é: como as permissões estão incompletas, as DLLs geradas pelo próprio aplicativo asp.net e as DLLs referenciadas diretamente podem obter permissões por meio de herança de permissões, enquanto outras DLLs externas que são referenciadas apenas por DLLs externas não podem herdar permissões devido a restrições de permissão. portanto, há um problema de permissões insuficientes.
Resolução de problemas:
Através de experimentos em meu computador, especula-se que as configurações do web.config raiz (no meu computador sua localização é C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG) foram modificadas no host virtual.
A seção de configuração de permissões padrão do web.config é a seguinte:
<local permitirOverride="true">
<sistema.web>
<política de segurança>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</securityPolicy>
<nível de confiança="Completo" originUrl="" />
</system.web>
</local>
Presumivelmente, as configurações modificadas no host virtual: <location permitOverride="false">
<sistema.web>
<política de segurança>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</securityPolicy>
<nível de confiança="Alto" originUrl="" />
</system.web>
</location> Ele primeiro define permitirOverride como falso, o que impede a capacidade de redefinir permissões no web.config do usuário. Em seguida, ele definiu o nível de confiança como Alto em vez do padrão Completo. Após meus testes, desde que o nível de confiança não seja Completo, outras DLLs externas que são referenciadas apenas pela DLL externa não poderão ser carregadas. Portanto, recomendo que o suporte técnico defina a seção AllowOverride como true. Dessa forma, posso especificar novamente as permissões no web.config.
Exemplo: <trust level="Full" originUrl="" />
Não estudei aps.net recentemente, então não procurei cuidadosamente os motivos subjacentes. Talvez meu entendimento esteja errado. Espero que o especialista possa me dizer as razões subjacentes ou corrigir meus erros.