无法加载文件或程序集"System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"。

286

我已经将我的项目复制到一台仅安装了Visual Studio 2015 Community和SQL Server 2016 Express的干净Windows 10机器上。除了与Windows 10和VS2015或SQL Server安装在一起的框架版本外,没有安装其他任何框架版本。

当我尝试启动WebApi项目时,出现以下消息:

无法加载文件或程序集"System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"或其依赖项之一。系统找不到指定的文件。

该项目的packages包括:

<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />
在使用.NET Framework 4.6.1构建项目后,在bin文件夹中找不到System.Net.Http文件。
该文件的路径为:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll System.Net.Http.Formatting的路径为:
C:\Development\MyApp\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll
应该将整个项目定向到4.5.1,或者有没有其他方法可以引用正确的程序集?

1
你尝试过从NuGet包重新安装Web Api吗? - Mihai Alexandru-Ionut
1
无法加载文件或程序集“System.Web.Http, Version=4.0.0.0” 。自2012年升级后相关错误。 - user6522773
尝试了那个SO问题中提出的所有建议答案,但目前为止都没有起作用。我还运行了update-package xxx -reinstall命令来重新安装我正在使用的所有NuGet包,但也没有起作用。 - Ivan-Mark Debono
只需参考这个链接,以后再感谢我。https://dev59.com/X6vka4cB1Zd3GeqPw66z - Ragul
21个回答

341

在我的web.config(或app.config)中更改绑定信息 - 我认为这是一种“hack”方法,但可以让您在NuGet软件包更新破坏您的应用程序并给出System.Net.Http错误后继续进行项目。

oldVersion="0.0.0.0-4.1.1.0"newVersion="4.0.0.0"设置如下:

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

6
我曾一次成功地将内容部署到Azure,然后15分钟后进行了另一个部署,结果遇到了与O.P.中所述完全相同的错误。通过在服务器上调整web.config文件中的特定答案,解决了我的问题。但是,我不知道为什么第一次部署会成功。我在两次部署之间没有更改依赖关系。 - bkwdesign
12
干得好。我可以看到发生了什么事情,我在一个基础域项目中安装了一个包,我非常确定已经安装了System.Net.Http NuGet(可能是高版本的4.1.x),而我一旦这样做,就会在各个地方收到这些警告。这解决了Web项目的问题,但是建议引用所有项目中的NuGet包的人上面提到的方法则消除了所有警告。不过,当涉及到引用新旧.NET时,我是唯一担心混合的吗?这让我害怕将通常作为NuGet包(dll hell)的本地dll引用。 - Nicholas Petersen
7
以下是微软回答为什么这是正确的方式:https://github.com/dotnet/corefx/issues/25773 - GL_monk-342435
51
完全移除绑定重定向对我起了作用。 - sbkrogers
4
是的,只需删除 system.net.http 和 system.runtime 的行即可。这样就可以解决问题了。 - ZZZ
1
将项目更新到 .net 4.8,问题仍然得到解决。 :) (五年前的帖子..令人惊讶) - Manish Gupta

324

请按照以下步骤进行:

  1. 将 Visual Studio 更新到最新版本(很重要)

  2. web.config 文件中删除所有绑定重定向。

  3. .csproj 文件中添加以下内容:

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
    
  4. 构建项目

  5. bin 文件夹中应该有一个名为 (WebAppName).dll.config 的文件

  6. 它应该有重定向,将其复制到 web.config

  7. .csproj 文件中删除上面的代码片段

应该可以运行。


4
请记得从生成的文件中复制绑定重定向内容,第一次编译时您会遇到上述错误,但是请前往 bin 文件夹获取如上所述的已生成 (webappname).dll.config 文件,将整个重定向列表复制到您的 web.config 中,然后重新编译。这对我非常有帮助,请确保首先使用 NuGet 整合工具清理尽可能多的引用。 - Chris Schaller
8
太棒了!这真的对我有用。@EK_AllDay,你需要将“AssemblyRedirects”复制回原始的web.config文件中。 - David De Sloovere
23
这里应该授予传奇徽章!只是顺便提一下,当我将AssemblyRedirects复制回web.config时,我发现再也没有System.Net.Http的绑定。所以我们可以假设VS现在使用的是随 .Net框架捆绑的默认程序集,而不是它自己的版本? - EvilDr
3
我花了超过6个小时来解决GAC、参考程序集、版本冲突、毫无意义的版本号等问题,最后我发现我真的应该获得这个传说中的徽章。这是唯一解决我的问题的方法。天哪,我讨厌System.Net.Http以及与之相关的所有问题背后的愚蠢。DLL地狱仍然存在。 - julian guppy
12
将项目从4.7.2迁移到4.8时遇到了错误。按照步骤进行操作后,最终结果是不需要在我的web.config中使用System.Net.Http绑定。 - seagulledge
显示剩余15条评论

40

在我的一个项目中,有一个版本较高的System.Net.Http nuget包,在我的启动项目中引用了System.Net.Http v4.0.0,我只需在启动项目中安装System.Net.Http nuget包,问题就解决了


1
我在一个解决方案中有三个项目 - 让我们称它们为“A”,“B”和“C”。 “A”是启动项目,与“B”或“C”无关。 “C”是“B”的测试项目。在“C”中运行我的测试失败了,因为我没有像“A”一样引用(System.Net.Http)项目。 - Rasmus Bækgaard

26

请修改以下内容:

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />

以下内容:

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0" />

在web.config文件中


2
根本原因:https://coderjony.com/blogs/solution-could-not-load-file-or-assembly-systemnethttp-version-4200-culture-neutral-publickeytoken-b03f5f7f11d50a3a-or-one-of-its-dependencies-the-system-cannot-find-the-file-specified/ - Andy Joiner
这对我有用,我的 oldVersion0.0.0.0-4.2.0.0 - 但是将 newVersion 设置为上述内容就可以了。 - Lazlow

17

以上的bind-redirect对我没有起作用,所以我在web.config中注释掉了对System.Net.Http的引用。没有它,一切似乎都正常工作。

  <system.web>
    <compilation debug="true" targetFramework="4.7.2">
      <assemblies>
        <!--<add assembly="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />-->
        <add assembly="System.ComponentModel.Composition, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
      </assemblies>
    </compilation>
    <customErrors mode="Off" />
    <httpRuntime targetFramework="4.7.2" />
  </system.web>

1
这在Visual Studio 2017(15.9.4)中有效,允许您使用System.Net.Http(4.3.4)NuGet包进行构建,而不是直接引用.NET 4.7.2框架发布的DLL。要在IDE中使用已安装的引用(没有引入其他依赖项),请执行以下操作:1)删除web/app.config绑定重定向;2)删除System.Net.Http NuGet包;3)打开“添加新引用”,并直接链接到与.NET 4.7一起发布的新4.2.0.0版本。 - EnocNRoll - AnandaGopal Pardue
1
这对我在VS2019中起作用,将一个应用程序从4.6.1迁移到4.7.2。 - cklimowski
我有一个控制台应用程序项目,它作为WebJob工作。在创建SendGrid API客户端时,它抛出了异常。从app.config中删除绑定重定向后,一切都开始正常工作。感谢您的建议,否则我永远不会想到这个。 - kurdemol94

13
如果您的解决方案中有多个项目,则在Visual Studio中右键单击解决方案图标,选择“管理解决方案的NuGet包”,然后单击第四个选项卡“整合”以将所有项目统一到相同的DLL版本。这样将为您提供要整合的参考程序集列表。单击列表中的每个项目,然后单击出现在右侧的选项卡中的安装按钮即可。

4
结合@sajeetharan的答案中提到使用AutoGenerateBindingRedirects,似乎旧版本的VS或NuGet包可能会留下错误的绑定语句。进行一次彻底的清理可以帮助很多。 - Chris Schaller

11
这将适用于.NET 4.7.2和Visual Studio 2017(15.9.4):
  • 删除web/app.config的绑定重定向
  • 删除System.Net.Http的NuGet包
  • 打开“添加新引用”,直接链接到.NET 4.7.2随附的新4.2.0.0版本构建

![image](https://user-images.githubusercontent.com/38843378/50998531-b5bb3a00-14f5-11e9-92df-6c590c469349.png)


9
你可以通过升级项目到.NET Framework 4.7.2来解决这个问题。这是由Alex Ghiondea - MSFT回答的。请为他点赞,因为他真的值得!

This is documented as a known issue in .NET Framework 4.7.1.

As a workaround you can add these targets to your project. They will remove the DesignFacadesToFilter from the list of references passed to SGEN (and add them back once SGEN is done)

<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <DesignFacadesToFilter Include="System.IO.Compression.ZipFile" />
    <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" 
        Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" /> 
    <ReferencePath Remove="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target>

<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <ReferencePath Include="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." />
</Target>

Another option (machine wide) is to add the following binding redirect to sgen.exe.config:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime> This will only work on machines with .NET Framework 4.7.1. installed. Once .NET Framework 4.7.2 is installed on that machine, this workaround should be removed.

上面链接问题的这个答案现在是相关的答案: https://dev59.com/WFUM5IYBdhLWcg3wINWk#52883065有关详细信息,请查看答案评论。 - EnocNRoll - AnandaGopal Pardue

7
  1. 打开 Web.config 文件并删除 <runtime> 标签及其内部所有内容。

    <**runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> </runtime>

  2. 保存并关闭 Web.config 文件。

  3. 打开“程序包管理器控制台”并运行以下命令:

    Add-BindingRedirect

当我的团队成员从 .NET Framework 4.6.1 升级到 .NET Framework 4.8 和 VS 2017 升级到 VS 2022 时,这解决了我的问题。


这解决了我们从Visual Studio 2019迁移到2022的.Net Framework项目的问题。@Syed - 感谢您的答案,为我们节省了很多时间。 - Johan J v Rensburg
这比所选答案更好,因为它可以自动完成。请参阅文章,以获取有关此解决方案的更多信息。 - somethingRandom
非常感谢你,兄弟!来自印度海得拉巴。我怎么才能给你100分的悬赏呢? - HydPhani

6

在VS2017中,4.6.1-2版本的用户可能会遇到不希望的情况,即他们的System.Net.Http版本被VS2017或Msbuild 15想要使用的版本所替换。

我们在这里删除了此版本:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll

和这里:

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll

然后使用我们通过NuGet引用的版本构建项目。


对我有效的方法是暂时从“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2”中移除System.Net.Http,这样当我在项目中添加对System.Net.Http的引用并选择4.0.0版本时,它实际上引用了那个版本。但是这个答案帮助我想到了这一点,所以谢谢 :) - Mie ElMansy

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