Minderung: Deserialisierung von Objekten über App-DomänenMitigation: Deserialization of Objects Across App Domains

In Fällen, in denen eine App zwei oder mehr App-Domänen mit unterschiedlichen Anwendungsbasen verwendet, löst der Versuch, Objekte im logischen Aufrufkontext über App-Domänen hinweg zu deserialisieren, eine Ausnahme aus.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.

Diagnose des ProblemsDiagnosing the issue

Das Problem tritt bei der folgenden Abfolge von Bedingungen auf:The issue arises under the following sequence of conditions:

  1. Eine Anwendung verwendet zwei oder mehr App-Domänen mit unterschiedlichen Anwendungsbasen.An app uses two or more app domains with different application bases.

  2. Einige Typen werden explizit zu LogicalCallContext hinzugefügt, indem eine Methode wie LogicalCallContext.SetData oder CallContext.LogicalSetData aufgerufen wird.Some types are explicitly added to the LogicalCallContext by calling a method such as LogicalCallContext.SetData or CallContext.LogicalSetData. Diese Typen werden nicht als serialisierbar markiert und werden nicht im globalen Assemblycache gespeichert.These types are not marked as serializable and are not stored in the global assembly cache.

  3. Später versucht Code, der in der nicht standardmäßigen App-Domäne ausgeführt wird, einen Wert aus einer Konfigurationsdatei zu lesen oder XML für die Deserialisierung eines Objekts zu verwenden.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. Um aus einer Konfigurationsdatei zu lesen oder das Objekt zu deserialisieren, versucht ein XmlReader-Objekt auf das Konfigurationssystem zuzugreifen.In order to read from a configuration file or deserialize the object, an XmlReader object tries to access the configuration system.

  5. Wenn das Konfigurationssystem noch nicht initialisiert wurde, muss es seine Initialisierung abschließen.If the configuration system has not already been initialized, it must complete its initialization. Dies bedeutet unter anderem, dass die Laufzeit wie folgt einen stabilen Pfad für ein Konfigurationssystem erstellen muss:This means, among other things, that the runtime has to create a stable path for a configuration system, which it does as follows:

    1. Sie sucht nach einem Beweis für die nicht standardmäßige App-Domäne.It looks for evidence for the non-default app domain.

    2. Sie versucht, den Beweis für die nicht standardmäßige App-Domäne auf Grundlage der Standard-App-Domäne zu berechnen.It tries to calculate the evidence for the non-default app domain based on the default app domain.

    3. Der Aufruf, um einen Beweis für die Standard-App-Domäne zu erhalten, löst einen Aufruf über die App-Domänen hinweg auf, der von der nicht standardmäßigen App-Domäne zur Standard-App-Domäne verläuft.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. Im Rahmen des über die App-Domänengrenzen hinweg geltenden Vertrags in .NET Framework muss der Inhalt des logischen Aufrufkontexts auch über App-Domänengrenzen hinweg gemarshallt werden.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. Da die Typen im logischen Aufrufkontext nicht in der Standard-App-Domäne aufgelöst werden können, wird eine Ausnahme ausgelöst.Because the types that are in the logical call context cannot be resolved in the default app domain, an exception is thrown.

MinderungMitigation

Gehen Sie wie folgt vor, um dieses Problem zu umgehen:To work around this issue, do the following

  1. Suchen Sie bei Auftreten der Ausnahme nach dem Aufruf von get_Evidence in der Aufrufliste.Look for the call to get_Evidence in the call stack when the exception is thrown. Bei der Ausnahme kann es sich um verschiedene Ausnahmen handeln, einschließlich FileNotFoundException und SerializationException.The exception can be any of a large subset of exceptions, including FileNotFoundException and SerializationException.

  2. Identifizieren Sie die Position in der App, an der keine Objekte zum logischen Aufrufkontext hinzugefügt werden, und fügen Sie folgenden Code hinzu: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");  
    

Siehe auchSee Also

Änderungen zur LaufzeitRuntime Changes