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


92

我有一个奇怪的问题。
我使用MVC 4和新的Web API开发了一个应用程序,并且在本地运行良好。我在服务器上安装了MVC4并部署了该应用程序。现在我得到以下错误:

无法加载文件或程序集'System.Net.Http,版本= 2.0.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自HRESULT的异常:0x80131040)

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

有趣的是,我在包文件夹中或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的“汇编”部分下进行了清洁,甚至找不到该应用程序本身了。


您是否为此项目使用了“添加可部署的依赖项”功能?
ChristiaanV

不,没有尝试。但是,我已经重新设置了所有内容,现在可以使用了。...并不是很令人满意,但是...
Remy 2012年

每次重新启动计算机并重新启动Visual Studio时,都会遇到此问题。如果我清洁然后重新构建解决方案,它就会以某种方式消失。
frostshoxx

Answers:


30

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

  1. 将我的项目切换到.NET 4.0配置文件。
  2. 卸载的Web API NuGet软件包。
  3. 再次安装Web API(Beta)NuGet程序包。
  4. 验证.csproj文件包含所有引用的程序集,因此它将始终从Bin文件夹而不是GAC中获取该文件。

1
我的项目以某种方式开始工作,但我不知道为什么...您的方法似乎可行。
雷米2012年

亚历山大-我如何更改为.NET 4.0配置文件。在Visual Studio中?bin文件夹在哪里?.csproj文件是web.config文件吗?Thx
WhoAmI 2014年

114

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

现在就像魅力一样工作。


4
仍应通过此更改将程序集设置为在本地复制吗?
拉斯姆斯·克里斯滕森

3
对我来说,问题是我的一个Web Api NuGet软件包依赖于System.Net.Http 2.0.0.0,但是我的参考是2.1.10.0,该输出到了我的bin文件夹中。
JustinMichaels 2013年

2
这是正确的(正如贾斯汀·迈克尔斯所说)。依赖关系是指2.0.0.0,而程序集引用是指2.1.xx。您需要解决的所有事情就是绑定重定向。
Tod Thomson

2
这应该被标记为正确答案。我想这就是为什么所有其他用户都推高该选项的原因。谢谢,Krzysztof!
布莱斯

3
问题可能不是对System.Net.Http的直接引用,而是在您要引用的其他一个库中使用的间接引用。这就是为什么设置本地副本通常不能解决此问题的原因。
Paul Keister 2013年

10

我的合作伙伴:

请注意1-4重定向到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>

我做了类似的事情,但是我将newVersion更新为4.0.0.0,并将oldVersion保留为
0.0.0.0-2.0.0.0

2

在项目的“引用”文件夹中,应有对该dll的引用,版本应为2.0.0.0。确保将其设置为Copy Local = true。然后确保它找到通往服务器应用程序的bin文件夹的路径。

这是现在由nuget管理的库之一。因此,打开Nuget并确保所有内容都是最新的。并且在您的项目包目录中,文件应位于以下位置: \packages\System.Net.Http.2.0.20126.16343\lib\net40

您也可以尝试创建一个新的MVC4应用,然后查看该文件是否针对该应用显示。


1
实际上,这就是令我困惑的地方。我使用nuget,并且有这个文件夹。但是,如果我查看System.Net.Http,它的版本为1.0.0.0
Remy

1
这正是我解决的方法!由于这一切都在本地工作。我只需右键单击引用,然后在属性中将其设置Copy localtrue即可解决该问题!更容易/更好,然后在web.config文件中弄乱。只需将dll添加到您的bin文件夹中即可。
JP Hellemons,2013年

2

就我而言,我以一种更容易的方式修复了它,只需给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" />

1

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

  • 将package.config中的Microsoft.Net.Http版本从2.1.10.0更改为2.0.0.0
  • 在NuGet软件包管理器中卸载BCL可移植性包
  • 手动摆脱依赖库(System.Net.Http。*,其版本为2.1.10.0)
  • 添加对System.Net.Http 2.0.0.0的引用

1

在文件配置中,我删除了依赖程序集:

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

现在工作正常。


要正确显示XML标签-将文本设置为代码格式。为此,只需在每行之前添加四个空格。
Artemix 2013年

Tnx Artemix,这是我的第一个评论;)
StefanoM5

1

我在测试服务器(Windows 2008 R2)上遇到了此问题,该服务器据说已“准备好”部署;)

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

使用以下步骤修复:

  1. 此处下载的.NET Framework 4.5独立安装程序

  2. 在部署计算机上运行安装程序

安装完框架后,服务器希望重新启动,因此也要重启!我们很好走!!


1

我们正在使用VS 2013,创建了新的MVC 4 Web API,并且在TeamCity服务器上构建system.net.http.dll不是正确的版本时出现问题,但在具有VS 2013的本地开发人员计算机上构建良好已安装。

我们终于确定了问题所在。

当创建新的MVC 4 Web API并在项目创建时选择框架4.0时,我们发现已将DLL的正确NuGet软件包版本放入:.. \ packages \ Microsoft.Net.Http.2.0.20710.0 \ lib \ net40 \ System.Net.Http.dll

但是,此项目的.csproj文件表示此system.net.http.dll文件的路径是:.. \ packages \ Microsoft.Net.Http.2.0.30506.0 \ lib \ net40 \ System.Net.Http.dll

因此,尝试构建时,此路径差异失败,但在开发人员机器上的其他位置(而不是在TeamCity构建服务器上)找到文件的正确框架版本。

到目前为止,这是我们发现的唯一区别。在VS2013中更改.csproj文件中的路径并在本地Dev计算机上构建仍然可以找到。

现在检查版本控制并安装我们的TeamCity构建服务器(本地未安装VS 2013),可以在其NuGet软件包文件夹中找到该解决方案的.dll正确版本,并成功构建,而不是搜索system.net.http的另一个版本。 .dll并查找与框架不匹配的较新版本,从而导致构建失败。

不确定是否有帮助。

检查DLL的项目文件路径,并确保它与DLL的程序包文件夹路径匹配。


1

只是简化对我有用的其他答案。

我去了NuGet管理器,卸载了相关的软件包(在我的情况下是“ Microsoft ASP.NET Web API 2.1客户端库”和“ Json.NET”),然后重新安装了它们。只需点击几下。


0

关闭项目,再次打开它。然后,清洁解决方案+构建。为我工作


0

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

0

我有这个完全相同的问题!我查看了VS中的“警告”选项卡,并注意到我的一个nuget程序包是间接引用.NETFramework 4.5.0.0版的。我必须先卸载此软件包,然后重新安装4.0版本,但一定要指定支持4.0的软件包版本(默认情况下,该版本会回到4.5,我相信如果在安装软件包时未指定)。希望这可以帮助!


0

部署后,我们在服务器上发生了这种情况。原因可能是:

A)仍然悬挂在bin文件夹中的旧文件应该被删除

要么

B)没有对应用程序池标识用户的文件夹的读取访问权限。

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


0

我在Gembox.spreadsheet.dll 31版中遇到了相同的问题。

“无法加载文件或程序集'GemBox.Spreadsheet,版本= 39.3.30.1095,文化=中性,PublicKeyToken = b1b72c69714d4847”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040 )“

我尝试了这些文章中的几乎所有内容,但没有一个起作用。它只是通过简单的步骤即可解决。

我尝试构建单个项目,这些项目基本上设置了对dll的正确版本引用,并且错误完全从解决方案中消失了。


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>

虽然,您必须确保旧版本的覆盖率足够高,否则新版本可能无法重定向到您需要的特定版本,并且使用该新参考的位置将无法正常工作,因为旧参考已在bin目录中。


0

对于此错误(及类似错误),值得通过NuGet Consolidate(解决方案>管理NuGet软件包...)来确保解决方案中引用的每个类库中相同的引用组件版本一致,因为即使是稍旧的版本也可能具有依赖性在其他较旧的组件上。与更新一起使用很简单,可以省去很多麻烦。

这为我解决了这个问题,如果您要创建也引用MVC或其他基于Web的NuGet组件的帮助程序库,那么必须熟悉它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.