Ошибка DLL-версии
У меня есть веб-сайт, который спорадически выдает следующую ошибку:
Ошибка сервера в приложении "/".
Не удалось загрузить файл или сборку "ICSharpCode.SharpZipLib, Version = 0.85.3.365, Culture = neutral, PublicKeyToken = 1b03e6acf1164f73" или одну из его зависимостей. Расположенное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
Теперь я знаю, что у меня есть зависимость от этой DLL, но у меня есть версия 0.85.5 в моей системе. Я систематически удалял каждую более старую версию DLL с сервера, перекомпилировал все и переиздал. Но независимо от того, что я делаю, кажется, что после каждого повторного опубликования, первого или двух раз, когда кто-то посещает сайт, они получают эту ошибку. Затем после обновления один или два раза ошибка исчезает, и сайт функционирует как обычно.
Что еще более странно, если я смотрю на строку кода, где возникает ошибка:
URLRewriter.ProcessRewritingResult(status, excludedEnum, siteName, viewMode, relativePath);
URLRewriter
- это класс из стороннего пакета (Kentico CMS - CMS.URLRewritingEngine.dll). Я запустил Dependency Walker в этой DLL и не нашел никаких зависимостей в ICSharpCode.SharpZipLib.
Любые идеи, как это исправить?
EDIT: В предложении @JeremyThompson я запустил Process Monitor, чтобы поймать ошибку. Здесь дамп экрана, с выделенными выделенными фрагментами (и одно имя папки закрыто для неприкосновенности частной жизни). Вы можете просмотреть его полный размер, щелкнув его правой кнопкой мыши и т.д.
![enter image description here]()
РЕДАКТИРОВАТЬ: Здесь трассировка нагрузки от ошибки. Помогает ли это?
=== Информация о состоянии предварительной привязки ===
LOG: Пользователь = MY-SERVER-12\Administrator
LOG: DisplayName = ICSharpCode.SharpZipLib, Версия = 0.85.3.365, Культура = нейтральная, PublicKeyToken = 1b03e6acf1164f73 (Полностью указано)
LOG: Appbase = file:///C:/inetpub/wwwroot/MySite/
ВХОД: Начальный PrivatePath = C:\inetpub\wwwroot\MySite\bin
Вызывающая сборка: CMS.WebAnalytics, Version = 6.0.4377.2467, Culture = neutral, PublicKeyToken = 834b12a258f213f9.
===
LOG: Это связывание начинается в контексте нагрузки по умолчанию.
LOG: Использование файла конфигурации приложения: C:\inetpub\wwwroot\MySite\web.config
LOG: Использование файла конфигурации хоста: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.config
LOG: использование файла конфигурации машины из C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: послеполитическая ссылка: ICSharpCode.SharpZipLib, Version = 0.85.3.365, Culture = neutral, PublicKeyToken = 1b03e6acf1164f73
LOG: попытка загрузки нового файла URL:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib.DLL.
LOG: попытка загрузки нового файла URL:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib. DLL.
LOG: попытка загрузки нового файла URL:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.DLL.
LOG: попытка загрузки нового файла URL:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.DLL.
LOG: попытка загрузки нового файла URL:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib.EXE.
LOG: попытка загрузки нового файла URL:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib. EXE.
LOG: попытка загрузки нового файла URL:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.EXE.
LOG: попытка загрузки нового файла URL:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.EXE.
Ответы
Ответ 1
Теперь я знаю, что у меня есть зависимость от этой DLL, но у меня есть версия 0.85.5 в моей системе. Я систематически удалял каждую версию старше DLL с сервера, перекомпилировал все и переиздал.
Похоже, что "зависимость" ожидает версию OLDER DLL. Почему не ЗАМЕНИТЬ все копии версии NEWER (0.85.5) в вашей системе с версией OLDER (0.85.3.365)? (Обязательно проверьте папку "bin" вашего веб-приложения и "GAC": c:\windows\assemblylies)
Если вам нужно, вы можете загрузить более старую версию здесь: http://sourceforge.net/projects/sharpdevelop/files/SharpZipLib/0.85.3/
ПРИМЕЧАНИЕ:
- После замены DLL остановите IIS и очистите все временные ASP.Net
файлы. Например.:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Временная ASP.NET
Файлы
- ТАКЖЕ: не забудьте обновить решение Visual Studio, чтобы оно
ссылается на более старую версию.
Приветствия
Пит
Ответ 2
Вы упомянули, что первый или два раза пользователь посещает сайт, вы получаете ошибку.
Чтобы устранить проблему, я предлагаю вам запустить "Монитор процессов" и посмотреть, где его искать, чтобы найти и загрузить сборку.
-iisreset
-Start Process Monitor на сервере
- просмотрите несколько страниц и как можно быстрее воспроизведите проблему
-становить трассировку ProcessMonitor
-search в трассировке монитора процесса для ICSharpCode.SharpZipLib
Если это не удается, посмотрите, что еще было причиной:
-составить результаты ProcessMonitor как CSV
-открыть CSV в Excel
-фильтр всех столбцов
-выберите раскрывающийся список столбца с помощью Access Denied или...
Это должно сказать вам, в чем проблема с ошибкой Could not load file or assembly
Ответ 3
Итак, оказывается, что у Kentico есть своя зависимость от ICSharpCode.SharpZipZip.dll
- и он ожидает найти более старую версию. Я нашел подобное решение здесь. Вставив следующий блок в мой файл web.config, кажется, что я, наконец, исключил эту ошибку!
<runtime>
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73"/>
<bindingRedirect oldVersion="0.85.3.365" newVersion="0.85.5.452"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Я все еще не понимаю, почему Dependency Tracker не обнаружил эту зависимость?
РЕДАКТИРОВАТЬ: О, дорогая, это все равно не решило. Сейчас это случается реже, но после перезапуска IIS сегодня один из наших тестеров снова получил старое сообщение об ошибке!: - (
Ответ 4
Я думаю, вы были на правильном пути с переадресацией привязки. Однако позвольте мне предположить, что вместо привязки вашего приложения к старой версии вы пытаетесь связать зависимую сборку с более новой версией.
Обычно форсирование более старой версии является худшим выбором, поскольку, хотя он может исправить сборку depdenent, вы можете вводить ошибки совместимости в код, который зависит от более новой версии.
Ответ 5
Попробуйте подключиться к AppDomain.CurrentDomain.AssemblyResolve, чтобы вы могли видеть, когда/какая сборка загружается и явно задает местоположение загрузки.
Ответ 6
Являются ли Kentico CMS и ваше приложение определенным в одном пуле приложений? Попробуйте запустить приложение в своем собственном пуле приложений.
Что может произойти, когда рабочий процесс перерабатывается, иногда ваше приложение добавляется первым, и иногда Kentico CMS является первым, который будет добавлен, и это изменяет способ решения ICSharpCode.SharpZipLib.
Когда вы делаете обновление один или два раза случайно, ваше приложение загружается первым, что означает, что он работает.
Что такое пул приложений в IIS и Asp.Net?
ОБНОВЛЕНИЕ. Является ли ваше приложение веб-сайтом (скомпилированным при первом доступе) или веб-проектом (предварительно скомпилированным в Visual Studio). Если это веб-сайт, то вы можете преобразовать его в веб-проект и попробовать?
Ответ 7
вы можете использовать приложение Fuslogvw.exe, которое регистрирует загрузку сборок и предоставляет подробные сведения о ошибках загрузки.
Подробнее здесь: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx