Вопрос или проблема
Я боролся с 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.
Несколько моментов:
- Исключение SerializationException, которое вы видите, является ошибкой более высокого уровня. Это не коренная причина.
- Сообщение о том, что не удается найти сборку, означает несколько вещей:
- Вы либо не имеете нужного файла в директории bin приложения.
- Файл в директории bin неправильной версии. (более вероятно)
- Путь к временным файлам не имеет к этому отношения, это просто временное место, и файл мог уже быть скопирован ранее.
- 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
.
Причины ошибки
-
Неправильная версия сборки: Наиболее вероятная причина вашей ошибки заключается в том, что версия
FluentNHibernate
в каталогеbin
проекта не соответствует версии, которую ожидает приложение. Убедитесь, что вы используете нужную версию сборки. Это одна из самых распространенных ошибок, связанных с конфигурацией .NET приложений. -
Отсутствие сборки: Если файл отсутствует в каталоге
bin
или не может быть найден, это также вызовет аналогичную ошибку. Проверьте, что файл действительно там и корректно загружается во время выполнения. -
Проблемы с базой данных: Как вы уже выяснили, если ваше приложение не может подключиться к базе данных, это может привести к выбрасыванию исключений. Это особенно критично в контексте сериализации, где неудавшаяся операция может оказаться в несанкционированном AppDomain, где текущая контекстная информация недоступна.
-
Проблемы с средой выполнения: Иногда причина может крыться в конфигурации среды выполнения вашего приложения. Проверьте настройки вашего пулла приложений в IIS, убедитесь, что используется правильная версия .NET и что правила безопасности соответствуют требованиям вашего приложения.
Рекомендации по устранению
-
Проверка версии сборки: Проверьте все зависимости вашего приложения, убедитесь, что версия
FluentNHibernate
соответствует версии в файлах конфигурации вашего приложения. Обновите сборку, если это необходимо. -
Диагностика с помощью WinDbg: Для более глубокого анализа загрузите и используйте WinDbg. Подключитесь к процессу
w3wp.exe
и наблюдайте за стек-трейсами и исключениями, которые возникают при запуске приложения. Это поможет вам pinpoint, где система теряет управление. -
Проверка базы данных: Убедитесь, что ваше приложение имеет доступ к базе данных. Проверьте строку соединения, права доступа и наличие самой базы. Проблемы с соединением могут вызвать выброс других исключений, которые запутывают диагностику.
-
Логи ошибок: Просмотрите журналы IIS и вашу собственную обработку ошибок. Они могут содержать дополнительную информацию о том, что именно произошло перед сбоем.
Заключение
Выявление и устранение причины ошибки System.Runtime.Serialization.SerializationException
требует комплексного подхода. Убедитесь, что все зависимости вашего приложения корректны, и устраняйте возможные проблемы с подключением к базе данных, прежде чем делать более сложные выводы о конфигурации IIS. Важно помнить, что в большинстве случаев проблемы такого рода не являются ошибками IIS как такового, а скорее связаны с приложением и его окружением.
Ваша методология должна основываться на систематическом анализе, тщательной проверке и использовании инструментов диагностики. Это обеспечит вам необходимую уверенность и понимание ситуации, что в конечном итоге позволит избежать дальнейших проблем и обеспечить стабильность работы вашего приложения.