【问题标题】:Could not load file or assembly 'System.Net.Http, Version=2.0.0.0 in MVC4 Web API无法在 MVC4 Web API 中加载文件或程序集 'System.Net.Http,版本 = 2.0.0.0
【发布时间】:2012-03-14 23:24:40
【问题描述】:

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

无法加载文件或程序集 'System.Net.Http, Version=2.0.0.0, Culture=neutral, 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 核心库(测试版)依赖于 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 的程序集部分下进行清理,甚至找不到应用程序本身。

【问题讨论】:

  • 您是否为此项目使用了“添加可部署依赖项”功能?
  • 不,没试过。但我已经把所有东西都设置好了,现在它可以工作了......不是很令人满意,但是......
  • 每次我重新启动机器并重新启动 Visual Studio 时都会遇到这个问题。如果我清理然后重建解决方案,它就会以某种方式消失。

标签: asp.net asp.net-mvc-4 asp.net-web-api


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    去一个类似的问题,许多 cmets 中提到的指令运行良好

    <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 目录中.

    【讨论】:

      【解决方案3】:

      我在 Gembox.spreadsheet.dll 版本 31 上遇到了同样的问题。

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

      我几乎尝试了这些文章中的所有内容,但都没有奏效。只需简单的步骤即可修复。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            我们在部署后在服务器上发生了这种情况。它是由以下任一原因引起的:

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

            B) 对应用程序池身份用户的文件夹没有读取权限。

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

            【讨论】:

              【解决方案7】:

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

              我们终于确定了问题。

              在创建新的 MVC 4 Web API 并在项目创建时选择框架 4.0 时,我们发现正在放入正确的 NuGet 包版本 DLL: ..\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 构建服务器上找不到文件的正确框架版本。

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

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

              不确定这是否有帮助。

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

              【讨论】:

                【解决方案8】:

                我遇到了同样的问题!我查看了 VS 中的警告选项卡,发现我的一个 nuget 包间接引用了 .NETFramework 版本 4.5.0.0。我不得不卸载这个包,然后重新安装 4.0 版本,但一定要指定支持 4.0 的包版本(如果你在安装包时没有指定,我相信它会默认回到 4.5)。希望这会有所帮助!

                【讨论】:

                  【解决方案9】:

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

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

                  使用以下步骤修复:

                  1. HERE 下载 .NET Framework 4.5 独立安装程序

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

                  框架安装后,服务器需要重新启动,所以它和volla!我们很高兴!

                  【讨论】:

                    【解决方案10】:

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

                    【讨论】:

                      【解决方案11】:

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

                      在我发现的 web.config runtime 部分

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

                      现在像魅力一样工作。

                      【讨论】:

                      • 是否仍应将程序集设置为通过此更改复制本地?
                      • 对我来说问题是我的一个 Web Api NuGet 包依赖于 System.Net.Http 2.0.0.0 但我的参考是 2.1.10.0 被输出到我的 bin文件夹。
                      • 这是正确的(正如贾斯汀迈克尔斯所说)。依赖项是指 2.0.0.0,但您的程序集引用是 2.1.x.x。您需要解决的只是绑定重定向。
                      • 这一项应该被标记为正确答案。我想这就是为什么所有其他用户都在推高这个选项的原因。谢谢你,克日什托夫!
                      • 问题可能不是对 System.Net.Http 的直接引用,而是在您引用的其他库之一中使用的间接引用。这就是为什么设置本地复制通常不会解决此问题的原因。
                      【解决方案12】:

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

                      【讨论】:

                        【解决方案13】:

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

                        <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 标签 - 将您的文本格式化为代码。为此,只需在每行之前添加四个空格。
                        • Tnx Artemix,这是我的第一条评论 ;)
                        【解决方案14】:

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

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

                        【讨论】:

                          【解决方案15】:

                          我的合作伙伴:

                          注意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
                          【解决方案16】:

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

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

                          【讨论】:

                          • 不知何故我的项目开始工作,但我不知道为什么......你的方法似乎可行。
                          • alexanderb - 我如何更改为 .NET 4.0 配置文件。在 Visual Studio 中? bin 文件夹在哪里? .csproj 文件是 web.config 文件吗?谢谢
                          【解决方案17】:

                          在您项目的References 文件夹中应该有对该dll 的引用,并且版本应该是2.0.0.0。确保将其设置为 Copy Local = true。然后确保它可以找到您的服务器应用程序的 bin 文件夹。

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

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

                          【讨论】:

                          • 实际上,这让我感到困惑。我使用nuget,我有这个文件夹。但是如果我查看 System.Net.Http 它的版本是 1.0.0.0
                          • 这正是我修复它的方法!因为这一切都在本地工作。我只是右键单击引用并在属性中,我已将 Copy local 设置为 true 来解决它!更容易/更好然后在 web.config 文件中搞乱。只需将 dll 添加到您的 bin 文件夹即可。
                          猜你喜欢
                          • 2012-08-20
                          • 2018-10-04
                          • 2020-01-05
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-07-31
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多