Устранение рисков: десериализация объектов между доменами приложений

В некоторых случаях, когда приложение использует два или большее количество доменов с разными базовыми папками приложения, при попытке выполнить десериализацию объектов в логическом контексте вызова между доменами приложения возникнет исключение.

Диагностика проблемы

Проблема возникает при следующей последовательности условий.

  1. Приложение использует два или большее количество доменов приложений с разными базовыми папками приложения.

  2. Некоторые типы явно добавляются в LogicalCallContext путем вызова метода, например LogicalCallContext.SetData или CallContext.LogicalSetData. Эти типы не отмечены как сериализуемые и не сохраняются в глобальном кэше сборок.

  3. Затем код, выполняющийся в домене приложения не по умолчанию, пытается считать значение из файла конфигурации или использовать XML для десериализации объекта.

  4. Чтобы считать значение из файла конфигурации или десериализовать объект, объект XmlReader пытается получить доступ к системе конфигурации.

  5. Если система конфигурации еще не была инициализирована, это следует сделать. Это означает, что, помимо прочего, среда выполнения должна создать стабильный путь для системы конфигурации, следующим образом.

    1. Выполняется поиск сведений о том, что домен приложений не является доменом по умолчанию.

    2. Среда выполнения пытается вычислить свидетельство наличия домена приложений не по умолчанию, основываясь на домене приложений по умолчанию.

    3. Вызов для получения свидетельства о наличии домена приложений по умолчанию активирует вызов домена для нескольких приложений из домена приложений не по умолчанию в домен приложений по умолчанию.

    4. В рамках контракта домена между приложениями в платформа .NET Framework содержимое контекста логического вызова также необходимо маршалировать по границам домена приложения.

  6. Поскольку типы логическом контексте вызова не могут быть разрешены в домене приложений по умолчанию, возникает исключение.

Исправление

Чтобы устранить эту проблему, выполните следующие действия.

  1. При возникновении исключения найдите вызов get_Evidence в стеке вызовов. Может возникать любое исключение из подмножества исключений, включая FileNotFoundException и SerializationException.

  2. Найдите в приложении место, где в логический контекст вызова не добавляются никакие объекты, и добавьте следующий код.

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

См. также