Mitigação: desserialização de objetos em domínios de aplicativosMitigation: Deserialization of Objects Across App Domains

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.In some cases, when an app uses two or more app domains with different application bases, the attempt to deserialize objects in the logical call context across app domains throws an exception.

Diagnosticar o problemaDiagnosing the issue

O problema surge na seguinte sequência de condições:The issue arises under the following sequence of conditions:

  1. Um aplicativo usa dois ou mais domínios de aplicativo com bases de aplicativo diferentes.An app uses two or more app domains with different application bases.

  2. Alguns tipos são adicionados explicitamente a LogicalCallContext chamando-se um método como LogicalCallContext.SetData ou CallContext.LogicalSetData.Some types are explicitly added to the LogicalCallContext by calling a method such as LogicalCallContext.SetData or CallContext.LogicalSetData. Esses tipos não são marcados como serializáveis e não são armazenados no cache de assembly global.These types are not marked as serializable and are not stored in the global assembly cache.

  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.Later, code running in the non-default app domain tries to read a value from a configuration file or use XML to deserialize an object.

  4. Para ler de um arquivo de configuração ou desserializar o objeto, um objeto XmlReader tenta acessar o sistema de configuração.In order to read from a configuration file or deserialize the object, an XmlReader object tries to access the configuration system.

  5. Se o sistema de configuração ainda não tiver sido inicializado, ele deverá concluir sua inicialização.If the configuration system has not already been initialized, it must complete its initialization. Isso significa, entre outras coisas, que o runtime precisa criar um caminho estável para um sistema de configuração, que faz o seguinte:This means, among other things, that the runtime has to create a stable path for a configuration system, which it does as follows:

    1. Ele procura a evidência do domínio de aplicativo não padrão.It looks for evidence for the non-default app domain.

    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.It tries to calculate the evidence for the non-default app domain based on the default app domain.

    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.The call to get evidence for the default app domain triggers a cross-app domain call from the non-default app domain to the default app domain.

    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 de marshaling nos limites do domínio de aplicativo.As part of the cross-app domain contract in the .NET Framework, the contents of the logical call context also have to be marshaled across app domain boundaries.

  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.Because the types that are in the logical call context cannot be resolved in the default app domain, an exception is thrown.

ReduçãoMitigation

Para resolver esse problema, faça o seguinteTo work around this issue, do the following

  1. Procure a chamada para get_Evidence na pilha de chamadas quando a exceção for acionada.Look for the call to get_Evidence in the call stack when the exception is thrown. A exceção pode ser qualquer uma do grande subconjunto de exceções, incluindo FileNotFoundException e SerializationException.The exception can be any of a large subset of exceptions, including FileNotFoundException and SerializationException.

  2. Identifique o local no aplicativo em que nenhum objeto é adicionado ao contexto de chamada lógica e adicione o seguinte código:Identify the place in the app where no objects are added to the logical call context and add the following code:

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

Consulte tambémSee also