Облачная служба Azure: System.Net.Http.Formatting.dll запрашивает старую Newtonsoft.Json.dll —> сбой инициализации роли

У меня есть довольно большое решение с примерно 80 проектами, работающими на сервере облачной службы Azure в качестве веб-роли с использованием WebAPI (v1). Я создал новое усовершенствование, касающееся согласования содержимого, внедрив пользовательский файл JsonReader/Writer. Когда я попытался использовать его, реализовав пользовательский MediaTypeFormatter на основе BaseJsonMediaTypeFormatter, он терпит неудачу - если быть точным, он терпит неудачу при публикации в Azure. Локальная эмуляция работает отлично. После публикации он терпит неудачу как:

...
Role entrypoint could not be created: System.TypeLoadException: Unable to load the role entry point due to the following exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'

=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
 (Fully-specified)
LOG: Appbase = file:///E:/approot/bin
LOG: Initial PrivatePath = E:\approot\bin
Calling assembly : System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
...

(Журнал получен из EventViewer->Журнал приложений и служб->Windows Azure).

Пока не попробовал использовать свой кастомный MediaTypeFormatter все работало корректно. Я искал в Интернете и SO какое-то решение, и хотя проблема не так редка, как я думал, ни одно из решений не помогло мне. Что я пробовал:

  • объединены все версии Newtonsoft.Json nugets во всех ссылающихся проектах
  • объединены все версии Microsoft.AspNet.WebApi.Client nuget
  • удалил все ссылки на обе упомянутые библиотеки и заменил эти ссылки на dll, ссылаясь вместо этого на nuget
  • обновил оба пакета Nuget до последней версии (Json 12.0.3 и Formatting 5.2.7) (я даже пытался использовать параметр -reinstall в команде Update-Package)
  • проверил все csproj вручную на наличие ссылок на старую Newtonsoft.Json версию.
  • Очищено решение, папки bin, obj, все файлы кеша
  • мой файл web.config содержит (и всегда содержал) правильные bindingRedirect для Newtonsoft.Json
  • (и, возможно, еще что-то, о чем я уже забыл)

Ни одно из решений не сработало, и я все еще получаю это странное сообщение. Мои вопросы:

  • Как это возможно, что библиотеке System.Net.Http.Formatting требуется какая-то конкретная версия Newtonsoft.Json, когда я прямо говорю, что она должна перенаправлять на 12-ю версию? Это потому, что это происходит во время запуска Webrole (может быть, потому, что он еще не учитывает web.config?)
  • Почему он работает на моем компьютере, но не развертывается в облачной службе Azure? Находит ли он и использует также старую версию библиотеки Newtonsoft.Json на моем локальном компьютере (и где, чтобы я мог попытаться удалить ее)?
  • Есть ли лучший способ отладить эту проблему? Может быть, запишите последовательность загрузки DLL, на которую ссылаются, чтобы приблизиться к ошибке? Или продублировать ошибку на моем локальном компьютере? На данный момент развертывание приложения, вход на удаленный рабочий стол и проверка EventViewer в облачном сервисе занимает очень много времени...

Любая подсказка, чтобы найти проблему, будет оценена по достоинству.


person Zoka    schedule 24.06.2020    source источник
comment
99,9% развернутой вами службы имеет версию Newtonsoft.Json, которая не является ни 6, ни 12.0.3... Добавление ссылки на Newtonsoft NuGet в проект all, вероятно, является лекарством...   -  person Alexei Levenkov    schedule 25.06.2020
comment
Только что попробовал - все проекты теперь ссылаются на Newtonsoft.Json 12.0.3 Nuget, развернул его, но все равно пишет ту же ошибку :-(   -  person Zoka    schedule 25.06.2020


Ответы (1)


Вы очень близки к решению с привязкой сборки web.config. Однако в сообщении об ошибке говорится: «Невозможно загрузить точку входа роли». Точка входа вашей роли — это ваш двоичный файл, в котором размещены методы OnStart/Run (например, WebRole1.dll), который отличается от содержимого вашего веб-сайта, размещенного в IIS.

Чтобы решить эту проблему, откройте файл .dll.config, расположенный в папке bin вашего проекта, и используйте ту же информацию о привязке сборки, а затем повторно разверните службу.

Дополнительные сведения см. в разделе https://docs.microsoft.com/en-us/archive/blogs/cie/cloud-services-roles-recycling-with-the-error-system-io-fileloadexception-could.-not-load-file-or-assembly.

person kwill    schedule 21.07.2020
comment
Это именно тот недостающий элемент. Спасибо, это работает. Мне просто нужно было скопировать *.dll.config из папки bin рядом с Web.config и включить в проект, а также установить CopyAlways для выходной папки. - person Zoka; 23.07.2020