Как заставить WebAPI использовать JSON.net 6.0.3 вместо 4.5?

После добавления WebAPI и зарегистрируйте его в Global.asax.

Мы обнаруживаем, что наши веб-приложения разбиваются по этой строке:

Line 17:             GlobalConfiguration.Configure(WebApiConfig.Register);

Сообщение об ошибке:

Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, 
PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. 
The system cannot find the file specified.

После некоторой проверки я обнаружил, что мы используем Json.net 6 в этом приложении MVC 5.1. Означает ли это, что нам нужно перейти на Json.net 4.5 для WebAPI для работы?


В моем .csproj файле есть только одна запись:

<Reference Include="Newtonsoft.Json, Version=6.0.3.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
  <Private>False</Private>
</Reference>

Когда я заглядываю в свой Json.NET в Manage NuGet Packages, он также говорит, что мой Json.NET - версия 6.0.3.

Кроме того, в моем web.config уже есть оператор bindingRedirect.

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>

Но если я посмотрю references веб-проекта внутри визуальной студии. Путь Newtonsoft.Json указывает на C:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend\Newtonsoft.Json.dll, но Copy Local является ложным.

Как это может быть? Как мы можем справиться с этим конфликтом?

Ответы

Ответ 1

Вам нужно добавить перенаправление привязки в ваш web.config(возможно, слияние с существующими перенаправлениями привязки):

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Ответ 2

Переадресация не работала для меня, пока я не обновил Web Api до последней версии:

PM> update-package Microsoft.AspNet.WebApi.Client -Version 4.0.30506
Updating 'Microsoft.AspNet.WebApi.Client' from version '4.0.20710.0' to '4.0.30506.0' in project 'TestProject.Api'.

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>

Ответ 3

Хорошо, вот мое исправление.

Ну, одна вещь, которую я не знаю, - это то, как ссылка Json.net указывает на dll в папке Blend в первую очередь.

Я попробовал re-NuGet, но нашел это довольно неудобным, потому что WebApi и WebGrease все зависят от него.

Итак, я просто пошел и удалил эту ссылку. Это, конечно, ломает все, что связано.

При добавлении ссылки назад я просто добавляю ссылку, просматривая DLL в папке /.package внутри этого проекта.

Это работает!

Довольно жестоко? Просто убедитесь, что мы проверили

  • .csproj
  • Web.Config
  • свойство в записи Reference в VS

Осмелится попробовать после того, как все базы будут закрыты.