Mitigação: desserialização de objetos em domínios de aplicativos

Em alguns casos, quando um aplicativo usa dois ou mais domínios de aplicativo com bases de aplicativo diferentes, a tentativa de desserializar objetos no contexto da chamada lógica nos domínios de aplicativo aciona uma exceção.

Diagnosticar o problema

O problema surge na seguinte sequência de condições:

  1. Um aplicativo usa dois ou mais domínios de aplicativo com bases de aplicativo diferentes.

  2. Alguns tipos são adicionados explicitamente a LogicalCallContext chamando-se um método como LogicalCallContext.SetData ou CallContext.LogicalSetData. Esses tipos não são marcados como serializáveis e não são armazenados no cache de assembly global.

  3. Mais tarde, a execução do código no domínio de aplicativo não padrão tenta ler um valor de um arquivo de configuração ou usar XML para desserializar um objeto.

  4. Para ler de um arquivo de configuração ou desserializar o objeto, um objeto XmlReader tenta acessar o sistema de configuração.

  5. Se o sistema de configuração ainda não tiver sido inicializado, ele deverá concluir sua inicialização. Isso significa, entre outras coisas, que o runtime precisa criar um caminho estável para um sistema de configuração, que faz o seguinte:

    1. Ele procura a evidência do domínio de aplicativo não padrão.

    2. Ele tentar calcular a evidência para o domínio de aplicativo não padrão com base no domínio de aplicativo padrão.

    3. A chamada para obter a evidência do domínio de aplicativo padrão dispara uma chamada de domínio de aplicativo cruzado do domínio de aplicativo não padrão para o domínio de aplicativo padrão.

    4. Como parte do contrato do domínio de aplicativo cruzado no .NET Framework, o conteúdo do contexto de chamada lógica também precisa realizar marshaling nos limites do domínio de aplicativo.

  6. Como os tipos que estão no contexto de chamada lógica não podem ser resolvidos no domínio de aplicativo padrão, uma exceção é acionada.

Atenuação

Para resolver esse problema, faça o seguinte

  1. Procure a chamada para get_Evidence na pilha de chamadas quando a exceção for acionada. A exceção pode ser qualquer uma do grande subconjunto de exceções, incluindo FileNotFoundException e SerializationException.

  2. Identifique o local no aplicativo em que nenhum objeto é adicionado ao contexto de chamada lógica e adicione o seguinte código:

    System.Configuration.ConfigurationManager.GetSection("system.xml/xmlReader");  
    

Confira também