У меня есть довольно большое решение с примерно 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.Jsonnugets во всех ссылающихся проектах - объединены все версии
Microsoft.AspNet.WebApi.Clientnuget - удалил все ссылки на обе упомянутые библиотеки и заменил эти ссылки на 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 в облачном сервисе занимает очень много времени...
Любая подсказка, чтобы найти проблему, будет оценена по достоинству.