93

我有一个奇怪的问题。
我使用 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 的程序集部分下进行清理,甚至找不到应用程序本身。

4

17 回答 17

117

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

现在像魅力一样工作。

于 2012-04-20T16:17:06.553 回答
31

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

  1. 将我的项目切换到 .NET 4.0 配置文件。
  2. 已卸载 Web API NuGet 包。
  3. 再次安装 Web API (Beta) NuGet 包。
  4. 验证 .csproj 文件包含所有引用的程序集,因此它将始终从 Bin 文件夹而不是 GAC 中获取。
于 2012-03-28T07:25:56.287 回答
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>
于 2012-08-05T20:58:42.413 回答
2

就我而言,我以一种更简单的方式修复了它,只需为对 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" />
于 2014-09-22T20:54:55.100 回答
2

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

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

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

于 2012-02-28T01:59:19.367 回答
1

就我而言,我无意中通过 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 的引用
于 2013-06-20T07:48:25.883 回答
1

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

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

使用以下步骤修复:

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

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

安装框架后,服务器想要重新启动,所以也这样做了!我们很高兴!

于 2013-10-08T13:02:26.080 回答
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>

现在它工作正常。

于 2013-07-26T09:47:50.133 回答
1

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

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

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

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

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

不确定这是否有帮助。

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

于 2014-05-15T16:12:23.823 回答
1

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

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

于 2015-08-03T14:12:46.420 回答
0

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

于 2013-12-12T19:18:46.383 回答
0

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

于 2013-08-22T01:22:29.433 回答
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>
于 2013-10-01T13:59:29.827 回答
0

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

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

或者

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

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

于 2014-07-23T21:33:02.610 回答
0

我对 Gembox.spreadsheet.dll 版本 31 有同样的问题。

" 无法加载文件或程序集 'GemBox.Spreadsheet, Version=39.3.30.1095, Culture=neutral, PublicKeyToken=b1b72c69714d4847' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040 ) "

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

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

于 2016-01-28T19:24:13.543 回答
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 目录中。

于 2016-02-08T11:23:56.310 回答
0

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

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

于 2017-02-08T11:48:17.113 回答