IIS сообщает об ошибке System.Runtime.Serialization.SerializationException при попытке загрузить dll.

Вопрос или проблема

Я боролся с IIS последние несколько дней, и ошибка, которую генерирует IIS, следующая:

Исключение: System.Runtime.Serialization.SerializationException

Сообщение: Не удается найти сборку ‘FluentNHibernate, Version=1.0.0.633, Culture=neutral, PublicKeyToken=8aa435e3cb308880’.

Странно, что если я проверяю в procmon, я вижу, как процесс IIS находит dll в директории, где я бы ожидал ее найти, а затем продолжает искать в других директориях ту же самую dll. Также он по какой-то причине ищет PDB для этой DLL. DLL также существует в временной директории, которую создает IIS:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\ws-sm\bc2df7a7\729516d\assembly\dl3\42ab9d3b\00d491a3_3e6bcd01\FluentNHibernate.DLL

Таким образом, он явно смог скопировать dll в свое рабочее место, но сообщает, что не может ее найти.

Я проверил все свои файлы web.config, и везде компиляция debug установлена на false, так что я удивлен видеть, что он ищет pdb.

Гугление этой ошибки не дало ничего полезного.

Я использую Win2k8 x86 с IIS 7, и мой пул приложений – ASP.NET v4.0 Integrated.

Это типичная проблема устранения неполадок .NET.

Несколько моментов:

  1. Исключение SerializationException, которое вы видите, является ошибкой более высокого уровня. Это не коренная причина.
  2. Сообщение о том, что не удается найти сборку, означает несколько вещей:
    1. Вы либо не имеете нужного файла в директории bin приложения.
    2. Файл в директории bin неправильной версии. (более вероятно)
  3. Путь к временным файлам не имеет к этому отношения, это просто временное место, и файл мог уже быть скопирован ранее.
  4. PDB или база данных отладочной информации ищется для того, чтобы извлечь символы и другую отладочную информацию, чтобы предоставить вам более подробную ошибку, в любом случае это не обязательно и редко поставляется с скомпилированными production DLL.

Я бы определенно убедился, что версия DLL Fluent NHibernate соответствует тому, что программное обеспечение ожидает для работы. Возможно, вам придется связаться с разработчиком/поставщиком, чтобы прояснить ситуацию. Скорее всего, это не проблема IIS, а скорее проблема приложения.

В конце концов, я разобрался и это не было связано с IIS. Публикую свой ответ на случай, если кто-то другой столкнется с подобной проблемой в будущем.

Моя проблема заключалась в том, что я не мог подключиться к одной из своих баз данных, и это вызвало выброс исключения. Каким-то образом (по-прежнему не уверен как) это было поймано одной вещью, а затем поймано IIS, который пытался сериализовать сообщение об ошибке, но не смог найти нужную DLL, так как в конечном итоге его поймали в другом AppDomain. Я нашел эту проблему, подключив windbg к процессу w3wp и наблюдая, как он запускается.

Так что если вы получите эту ошибку, попробуйте подключить windbg к своему процессу и посмотрите, какие ошибки возникают.

Ответ или решение

При возникновении ошибки System.Runtime.Serialization.SerializationException в IIS, вызванной попыткой загрузки DLL, важно учитывать несколько ключевых аспектов, чтобы правильно идентифицировать и устранить проблему.

Обзор ситуации

Итак, ваша проблема заключается в следующем: IIS не может найти сборку FluentNHibernate, несмотря на то что она, по вашему мнению, присутствует в каталоге, а в процессе мониторинга вы видите, что IIS ищет эту DLL в различных местах, включая временную директорию. Кроме того, вы заметили, что идет поиск PDB-файлов без явной необходимости, так как в ваших web.config файлах установлен режим компиляции debug=false.

Причины ошибки

  1. Неправильная версия сборки: Наиболее вероятная причина вашей ошибки заключается в том, что версия FluentNHibernate в каталоге bin проекта не соответствует версии, которую ожидает приложение. Убедитесь, что вы используете нужную версию сборки. Это одна из самых распространенных ошибок, связанных с конфигурацией .NET приложений.

  2. Отсутствие сборки: Если файл отсутствует в каталоге bin или не может быть найден, это также вызовет аналогичную ошибку. Проверьте, что файл действительно там и корректно загружается во время выполнения.

  3. Проблемы с базой данных: Как вы уже выяснили, если ваше приложение не может подключиться к базе данных, это может привести к выбрасыванию исключений. Это особенно критично в контексте сериализации, где неудавшаяся операция может оказаться в несанкционированном AppDomain, где текущая контекстная информация недоступна.

  4. Проблемы с средой выполнения: Иногда причина может крыться в конфигурации среды выполнения вашего приложения. Проверьте настройки вашего пулла приложений в IIS, убедитесь, что используется правильная версия .NET и что правила безопасности соответствуют требованиям вашего приложения.

Рекомендации по устранению

  1. Проверка версии сборки: Проверьте все зависимости вашего приложения, убедитесь, что версия FluentNHibernate соответствует версии в файлах конфигурации вашего приложения. Обновите сборку, если это необходимо.

  2. Диагностика с помощью WinDbg: Для более глубокого анализа загрузите и используйте WinDbg. Подключитесь к процессу w3wp.exe и наблюдайте за стек-трейсами и исключениями, которые возникают при запуске приложения. Это поможет вам pinpoint, где система теряет управление.

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

  4. Логи ошибок: Просмотрите журналы IIS и вашу собственную обработку ошибок. Они могут содержать дополнительную информацию о том, что именно произошло перед сбоем.

Заключение

Выявление и устранение причины ошибки System.Runtime.Serialization.SerializationException требует комплексного подхода. Убедитесь, что все зависимости вашего приложения корректны, и устраняйте возможные проблемы с подключением к базе данных, прежде чем делать более сложные выводы о конфигурации IIS. Важно помнить, что в большинстве случаев проблемы такого рода не являются ошибками IIS как такового, а скорее связаны с приложением и его окружением.

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

Оцените материал
Добавить комментарий

Капча загружается...