无法在MVC4 Web API中加载文件或程序集“System.Net.Http,Version = 2.0.0.0”

我有一个奇怪的问题。
我开发了一个MVC 4和新的Web API的应用程序,它在本地工作正常。 我在服务器上安装了MVC4并部署了应用程序。 现在我得到以下错误:

无法加载文件或程序集“System.Net.Http,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”或其某个依赖项。 定位的程序集清单定义与程序集引用不匹配。 (来自HRESULT的exception:0x80131040)

说明:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪,以获取有关错误的更多信息以及源代码的来源

有趣的是,我本地在我的包文件夹或ASP.NET MVC 4 \ Assemblies文件夹中的System.Net.Http版本是1.0.0.0。 我实际上从我的项目中删除了对System.Net.Http的引用,但我仍然得到相同的消息。 我有点困惑,它从哪里得到的2.0.0.0参考,为什么它会在本地工作,但不是在服务器上。

看着nuget依赖关系:

ASP.NET WEb API核心库(Beta)依赖于System.Net.Http.Formatting。
而System.Net.Http.Formatting取决于System.Net.Http。
我想这是从哪里来的。 但是我已经安装了这个软件包的版本2.0.20126.16343,只是里面的dll版本是1.0.0.0

我错过了什么吗?

更新:

这是另一个ASP.NET应用程序的子应用程序,但另一个仍然基于WebForms。 所以,有些事情正在变得混乱。 但是如果我在web.config中的组件部分下做一个干净的,如果甚至没有find应用程序本身了。

我在将应用程序部署到appharbor时遇到同样的问题。 它不支持.NET 4.5的问题。 我做了什么。

  1. 将我的项目切换到.NET 4.0configuration文件。
  2. 卸载Web API NuGet包。
  3. 再次安装Web API(Beta)NuGet包。
  4. validation.csproj文件包含所有引用的程序集,所以它将始终从Bin文件夹,而不是GAC。

在IIS 6.0上部署以前转换(从.NET 4.5到4.0)Web应用程序时,出现同样的错误。

在我发现的web.config 运行时节中

<dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/> </dependentAssembly> 

我已经改变了

 <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> 

现在工作就像魅力。

我的工作与:

注意到1-4的redirect到2.0

 <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> 

在你的项目的References文件夹中应该有一个对这个dll的引用,版本应该是2.0.0.0。 确保将其设置为Copy Local = true。 然后确保它find你的服务器应用程序的bin文件夹。

这是现在由nugetpipe理的图书馆之一。 所以打开Nuget,并确保一切都是最新的。 而在你的项目包目录中的文件应该在这里: \packages\System.Net.Http.2.0.20126.16343\lib\net40

你也可以尝试创build一个新的MVC4应用程序,看看该文件是否显示出来。

在我的情况下,我以一种更简单的方式修复了它,只是给了一个HintPath对nuget包的引用:

  <Reference Include="System.Data.Entity" /> <Reference Include="System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <Private>True</Private> + <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.dll</HintPath> </Reference> <Reference Include="System.Net.Http.WebRequest, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <Private>True</Private> + <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.WebRequest.dll</HintPath> </Reference> <Reference Include="System.Numerics" /> <Reference Include="System.Security" /> 

在我的情况下,我无意中通过NuGet添加到System.Net.Http版本2.1.10.0的依赖。 我无法摆脱在NuGet包pipe理器(因为其他包似乎依赖于它)。 但是这些软件包不依赖于这个特定的版本。 这是我为了摆脱它所做的(也可以使用NuGet控制台(使用-force参数)):

  • 将packages.config中的Microsoft.Net.Http版本从2.1.10.0更改为2.0.0.0
  • 在NuGet Package Manager中卸载BCL Portability Pack
  • 手动摆脱依赖库(System.Net.Http。*,其版本是2.1.10.0)
  • 添加对System.Net.Http 2.0.0.0的引用

在文件configuration我删除依赖大会:

 <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.0.0.0"/> <dependentAssembly> 

现在它工作正常。

我在testing服务器(Windows 2008 R2)上面临这个问题,而这个testing服务器据说已经“准备好”部署了;)

暗示是,当我检查我的DEV机器和部署服务器之间的System.net版本时,他们不匹配。

使用以下步骤修复:

  1. 从这里下载了.NET Framework 4.5独立安装程序

  2. 运行部署机器上的安装程序

框架的安装后,服务器想要重新启动,所以那个和volla! 我们很好去!

我们正在使用VS 2013,创build了一个新的MVC 4 Web API,并且在build立在我们的TeamCity服务器上时system.net.http.dll不是正确的版本,但是在我们的本地开发人员机器上安装了VS 2013安装。

我们最终确定了这个问题。

当创build一个新的MVC 4 Web API并在项目创build中select框架4.0时,我们发现正确的NuGet包的DLL版本被放入:.. \ packages \ Microsoft.Net.Http.2.0.20710.0 \ lib \ net40 \ System.Net.Http.dll

然而这个项目的.csproj文件说这个system.net.http.dll文件的path是:.. \ packages \ Microsoft.Net.Http.2.0.30506.0 \ lib \ net40 \ System.Net.Http.dll

所以,当构build尝试失败的path差异,但是在开发人员的机器上的其他地方find正确的框架版本的文件,但不是在我们的TeamCity构build服务器。

到目前为止,这是我们发现的唯一区别。 使用VS2013更改.csproj文件中的path并在本地开发机器上构build仍然可以find。

检查到版本控制,并使我们的TeamCity生成服务器(没有VS 2013本地安装)现在find解决scheme的NuGet包文件夹中的.dll的正确版本,并成功地生成,而不是search另一个版本的system.net.http .dll,并find一个不匹配框架的新版本,从而导致构build失败。

不知道这是否有帮助。

检查您的项目文件path的DLL,并确保它匹配您的DLL的包文件夹path。

只是简化其他答案为我工作。

我去了NuGetpipe理器,卸载相关的软件包(在我的例子中,“Microsoft ASP.NET Web API 2.1客户端库”和“Json.NET”)并重新安装它们。 只需点击几下。

closures该项目,再次打开它。 然后,清理解决scheme+构build。 为我工作

对于2.2.15.0版本,我这样做了:

 <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.2.15.0"/> </dependentAssembly> 

我有这个完全相同的问题! 我看了一下VS中的Warnings选项卡,注意到我的一个nuget包是INDIRECTLY引用.NETFramework版本4.5.0.0。 我不得不卸载这个软件包,然后重新安装4.0版本,但一定要指定支持4.0的软件包版本(如果你没有指定安装软件包时,它会默认回到4.5我相信)。 希望这可以帮助!

部署之后,我们在服务器上发生了这种情况。 这是由于:

A)bin文件夹中仍旧挂着的旧文件应该已被删除

要么

B)对“应用程序池标识”用户没有读取权限。

换句话说,对于我们来说,这是通过修复站点文件夹的权限并清除bin文件夹并重新部署来解决的。

我有与Gembox.spreadsheet.dll版本31相同的问题。

“无法加载文件或程序集”GemBox.Spreadsheet,Version = 39.3.30.1095,Culture = neutral,PublicKeyToken = b1b72c69714d4847“或其依赖项之一。 )“

我尝试了几乎所有这些文章,没有一个工作。 它只是简单的一步就修好了。

我试图build立个人项目,基本上build立了正确的版本引用的DLL和错误是完全没有解决scheme。

去一个类似的问题,许多评论中提到的指示工作正常

 <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.0.0.0"/> <dependentAssembly> 

虽然,您必须确保旧版本的覆盖率足够高,否则新版本可能无法redirect到您所需的特定版本,而使用新版本引用的位置将无法正常工作,因为较旧的引用已经在bin目录中。

对于这个错误(以及类似的情况),通过NuGet Consolidate(Solution> Manage NuGet Packages …)来确保相同的引用组件版本在解决scheme中引用的每个类库中都是一致的,因为即使稍微老一些的版本也可能有依赖关系在其他较旧的组件上。 与更新结合使用可以很简单,并且可以节省很多的痛苦。

这为我解决了这个问题,我想说,如果你正在创build也引用MVC或其他基于networking的NuGet组件的帮助程序库,那么必须熟悉它。