如何强制WebAPI使用JSON.net 6.0.3而不是4.5?

时间:2014-05-27 15:16:54

标签: c# json.net asp.net-web-api2 asp.net-mvc-5.1

添加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。

此外,bindingRedirect中已有web.config声明。

  <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>

但是,如果我查看visual studio中的Web项目的referencesNewtonsoft.Json指向C:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend\Newtonsoft.Json.dllCopy Local的路径为false。

怎么会这样?我们如何处理这场冲突?

3 个答案:

答案 0 :(得分:11)

您需要在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>

答案 1 :(得分:4)

在我将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>

答案 2 :(得分:2)

好的,这是我的修复。

我不知道的一件事是Json.net引用如何指向Blend文件夹中的dll。

我尝试重新NuGet,但发现它相当不方便,因为WebApi和WebGrease都依赖它。

所以我只是继续删除该引用。那当然会破坏一切相关的东西。

当添加引用时,我只需通过浏览到此项目内/.package文件夹下的dll来添加引用。

有效!

相当野蛮?请确保我们检查了

  • 的.csproj
  • Web.Config中
  • VS
  • 中参考条目中的属性

在所有基地都被覆盖后敢于尝试。