Ошибка 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