Visual Studio 2012 Web API项目无法运行 - 找不到Newtonsoft.Json。

59
在清理解决方案和重新构建之后,我的MVC 4 Web API项目无法正常工作。它找不到 Newtonsoft.Json 。
我知道Microsoft现在将其用作默认的JSON序列化程序-但该程序未列在项目的引用链表中,并且从NuGet中无法添加它,因为它已安装。
请问有没有人知道这里可能出了什么问题吗?
完整堆栈跟踪信息: [FileNotFoundException: 无法加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。系统找不到指定的文件。] MvcWebRole1.WebApiApplication.Application_Error() in d:\Data\Source Controlled Projects\georace\georace\Server\GeoRaceServer\MvcWebRole1\Global.asax.cs:70 [HttpException (0x80004005): 无法加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。系统找不到指定的文件。] System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +12838633 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +175 System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475 [HttpException (0x80004005): 无法加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。系统找不到指定的文件。] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12851296 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12679949
13个回答

81

好的 - 我自己找到了一个解决方法,分享给其他遇到这个微软 bug 的人。 问题是因为默认情况下包已经包含了 NuGet 引用,因此无法添加 NuGet 引用。因此...

  1. 打开 packages.config
  2. 删除 Newtonsoft.Json 条目。
  3. 保存并构建
  4. 从 NuGet 重新添加 Newtonsoft.Json。
  5. 构建和运行

43
您可以在“程序包管理器控制台”中键入以下命令:Update-Package Newtonsoft.Json -Reinstall,以重新安装 Newtonsoft.Json 程序包。 - Rubens Mariuzzo
5
这在我的开发环境中可以运行,但发布到服务器后仍然出现相同的错误。 - Piotr Kula
@RubensMariuzzo,我在VS 2012中哪里可以找到包管理器控制台? - theB3RV
2
@theB3RV,从菜单栏中选择工具,然后选择库包管理器,最后点击包管理器控制台。 http://docs.nuget.org/docs/start-here/using-the-package-manager-console - Rubens Mariuzzo
@RubensMariuzzo,没有库包管理器。 - theB3RV
2
@theB3RV 在菜单栏上,选择“视图”->“其他窗口”->“程序包管理器控制台”。 - Chrysalis

47

如果你想重新安装NuGet已经安装的任何软件包,只需在Package Manager Console中键入以下命令:

在任何项目中更新:

Update-Package Newtonsoft.Json -Reinstall

特定项目的更新

Update-Package Newtonsoft.Json -Reinstall -Project My.App

2
请注意,您需要更新版本的NuGet才能使用“-Reinstall”参数。我认为版本必须>=2.1,否则它无法识别您的命令。 - Nate Anderson

36

对我来说,唯一解决这个错误的方法是在我的web.config文件中添加缺失的部分,这部分内容我从这里的答案获取:https://dev59.com/qmMm5IYBdhLWcg3wO88q#20414714

这是我需要添加的内容:

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

4

我结合了其他SO贡献者提出的一些选项,还加入了一个新的选项。

首先,Nuget 2.1存在一些问题,这个问题已经在一个错误日志中记录,并在2.2.2版本中得到了修复。请参见此处:https://nuget.codeplex.com/workitem/3050

因此,我执行了以下步骤:

  1. 根据链接更新Nuget版本至2.2.2
  2. 通过从NUget卸载Json(右键单击项目并查找软件包,然后卸载)来删除我的项目中所有对Json的引用(即使这样做也不行)
  3. 从计算机上物理删除软件包文件。我在这里找到了软件包文件://projectdir/packages/Newtonsoft.JSON
  4. 从物理目录(//projectname/packages.config)中删除packages.config文件
  5. 完成上述步骤后,我再次通过Nuget添加了Newtonsoft,然后进行了重建,它就可以工作了。

4
我曾经遇到过同样的问题(在VS2012中)。没有任何答案能够帮助我。最终,我通过以下方法解决了这个问题:
1)转到“工具”->“扩展和更新”,然后更新(或安装)“NuGet包管理器”,接下来进入“在线”并安装“快速添加NuGet”和“NuGet引用”。
2)在安装完所有内容后,在您的项目中右键单击“引用”,选择“管理Nuget包”,在“已安装的包”中找到Json.NET。点击卸载-现在您不能这样做,但它会告诉您必须先卸载什么(某些ASP Web Api客户端)。因此,请先卸载所有这些内容,然后再尝试卸载“Json.NET”。现在进入“在线”并安装“Json.NET”,“ASP.NET WEB API客户端库”和“ASP.NET WEB API客户端OData”。
3)在Global.asax中删除“WebApiConfig.Register(GlobalConfiguration.Configuration);”这一行。
构建解决方案,一切都应该正常。我希望这可以帮助某些人 :) 祝好运!

对我没用。实际上,情况变得更糟了,因为版本无法相互解决。 - Mikaël Mayer
它在我的情况下运行正常,然后我注释了第三步骤,结果出现错误“System.Web.Http.GlobalConfiguration的类型初始化程序引发了一个异常”。为此,我打开了包管理器控制台,并键入了Install-Package Microsoft.AspNet.WebApi -IncludePrerelease,来自链接https://dev59.com/K2Ik5IYBdhLWcg3wp_mM。这样一来就可以了。感谢您的帮助。 - Zaker
这解决了我所有的问题,结束了一整天的挫败感,谢谢! - RyanOC

3

检查一下您是否有一个指向过时本地副本的“旧版”(先前的nuget)对JSON.NET的引用。

我有一个旧的Reference\Lib\JSON.NET,它在我的引用路径中,并且拥有优先级。

检查一下JSON.NET属性页面是否指向了预期的Nuget软件包版本。

我在团队服务器构建中遇到了这个问题,该构建进行了实时部署。我不得不修复我的原始解决方案并进行干净的构建,以确保旧的Reference\Lib\ DLL没有被选中。


1
成功了!在我的情况下,这是一个间接引用,它引用了我的自己的库,该库具有“旧式”JSON.NET引用。因此,为了解决问题,我必须向我的库添加一个Nuget包。 - Uwe Keim
1
@uwe 太棒了 :-) 请注意,您甚至不需要将它放在您的 .csproj 文件中 - 它只需要在引用路径文件夹中即可。 - Simon_Weaver

1
我遇到了相同的FileNotFoundException,结果发现我已经在我的项目中引用了Newtonsoft.Json库,但是"Copy Local"属性没有设置为TRUE。 如果您也遇到这种情况,请将其设置为TRUE,这样dll文件就会被复制到输出目录。

1
我测试了这里提到的所有方法,但都没有奏效。在我的情况下,我的文件路径如下所示:
  • #Projects/Web/App/...
问题的原因是#号。我将其删除后,一切正常。

1
我的Newtonsoft.json问题的原因略有不同。我开发了一个针对.Net 4.5构建的Windows应用程序。后来我发现客户的环境只支持.Net 4.0。为了保留.Net 4.5的工作,我将解决方案复制到一个新区域,并将解决方案属性更改为Microsoft.Net 4.0。然后我得到了错误提示,Newtonsoft.json找不到,是否缺少引用。
我按照上面提到的步骤删除了packages.config文件;删除了Newtonsoft.json;确保从\packages目录中删除了Newtonsoft.json;然后从NuGet重新安装Newtonsoft.json。我能够使用.Net 4.0编译和运行应用程序。
在此之前,packages.config文件显示Newtonsoft.json所定位的.Net版本是.Net 4.5。现在删除并添加Newtonsoft.json后,其目标版本为.Net 4.0。

我“认为”(未经测试)你可以只需更改packages.xml中的targetFramework属性从“net45”到“net40”以获得相同的效果(假设你已安装了两个版本)。 - BlackSpy

1
在我的情况下,我查看了同事的项目,不知何故使我的 Newtonsoft.Json 引用出现问题 - 所以我不得不将其删除。右键单击项目->管理 NuGet 包。在左侧单击“已安装的包”,然后选择 Json.NET 并卸载它。在我的情况下,我还必须卸载其他相关的包(如 Microsoft ASP.Net Web API 等)。在左侧选择“在线”,搜索 Json.Net,并重新安装它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接