无法加载文件或程序集“ System.Net.Http,版本= 4.0.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a”


165

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

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

无法加载文件或程序集“ System.Net.Http,版本= 4.0.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。

该项目的软件包包括:

<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构建项目后,System.Net.Http在文件bin夹中找不到该文件。

该文件的路径指向:

C:\ Program Files(x86)\ Reference Assemblys \ 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还是有其他方法引用正确的程序集?


您是否尝试过从NuGet软件包重新安装Web Api?
Mihai Alexandru-Ionut


尝试了该SO问题中的所有建议答案。到目前为止,没有任何效果。我还update-package xxx -reinstall为所有正在使用的nuget包运行。它也不起作用。
伊万·马克·德博诺


请参考一下,稍后再谢谢我stackoverflow.com/questions/50536842/…–
Ragul

Answers:


112

请遵循以下步骤,

  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文件中删除以上内容

它应该工作


1
现在,我无法加载文件或程序集“ Newtonsoft.Json,版本= 6.0.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自HRESULT的异常:0x80131040)
EK_AllDay '18年

2
您必须记住要从生成的文件跨绑定重定向进行复制,因此,第一次您会遇到上述错误,但是如上所述,请转到bin文件夹以获取生成的(webappname).dll.config,复制整个重定向列表到您的web.config中,然后重新编译。这确实对我有所帮助,但请确保先使用nuget合并工具来清理尽可能多的引用。
克里斯·谢勒

4
惊人。这实际上为我工作。@EK_AllDay您必须将AssemblyRedirects复制回原始的web.config。
David De Sloovere

3
⭐☝传奇徽章应该在这里!只是一个说明,当我将AssemblyRedirects复制回web.config时,我发现不再有System.Net.Http的绑定。因此,我们假设VS现在使用的是与.Net框架打包在一起的默认程序集,而不是其自己的版本?
EvilDr

1
这个答案救了我很多次,甚至我都停止计数了。应该标记为答案恕我直言。
塞巴斯蒂安·布德卡

258

更改我的web.config(或app.config)中的绑定信息-虽然在我看来是“ hack”,但使您可以在NuGet软件包更新使您的应用程序崩溃并为您提供System.Net.Http之后继续进行您的项目错误。

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

4
我一次部署到Azure,没有问题,然后15分钟后,一次连续部署给了我OP中所述的确切错误,并使用此精确答案对服务器上的web.config进行了调整,从而解决了我的问题。但是,我不知道为什么它第一次起作用。我并没有弄乱部署之间的依赖关系。
bkwdesign '17

8
做得好。我可以看到发生了什么,我在一个基本域项目中安装了一个程序包,我确定该程序已安装了System.Net.Http nuget(可能是4.1.x版的更高版本),并且一旦这样做,我就得到了这些警告无处不在。这解决了Web项目的问题,但是上面提到的在所有项目中引用nuget软件包的建议消除了所有警告。在引用方面,我是唯一关心新旧.NET混合的人吗?它使我害怕通常将本地dll引用为nuget包(dll地狱)。
尼古拉斯·彼得森

3
这是微软关于为什么这是正确方法的答案:github.com/dotnet/corefx/issues/25773
ghanashyaml

18
删除绑定重定向完全对我有用。
sbkrogers

1
是的,只需删除system.net.http和system.runtime的行。这样事情就变好了。
ZZZ

32

在我的一个项目中,有一个带有更高版本的System.Net.Http的nuget软件包。在我的启动项目中有对System.Net.Http v 4.0.0的引用,我刚刚在启动项目中安装了System.Net.Http nuget包,问题就解决了


我有一个解决方案三个项目-我们姑且称之为ABCA是启动项目,与B或都不相关CC是的测试项目BC由于没有参考(System.Net.Http)项目,因此无法运行测试A
RasmusBækgaard19年


12

如果您的解决方案中有多个项目,请右键单击Visual Studio中的解决方案图标,然后选择“管理解决方案的NuGet软件包”,然后单击第四个选项卡“合并”以将所有项目合并到相同版本的DLL。这将为您提供要合并的参考程序集的列表。单击列表中的每个项目,然后在右侧显示的选项卡中单击安装。


4
将此与来自@sajeetharan的有关使用AutoGenerateBindingRedirects的答案结合在一起,似乎VS或nuget软件包的较旧版本可能会留下不正确的绑定语句。进行良好的清理可以有很大帮助。
克里斯·谢勒

11

所以我注释掉参照以上绑定重定向并没有对我的工作System.Net.Httpweb.config。没有它,一切似乎都可以正常工作。

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

这在VS2019中对我有用,将应用程序从4.6.1迁移到4.7.2
cklimowski '19

我有一个控制台应用程序项目正在作为网络作业。创建SendGrid api客户端时抛出该异常。从app.config中删除绑定重定向后,一切开始工作。感谢您提出的建议,我从未想过。
kurdemol94

9

您可以通过将项目升级到.NET Framework 4.7.2来解决此问题。Alex Ghiondea-MSFT回答了这个问题。请投票支持他,因为他确实应得的!

在.NET Framework 4.7.1中,这被记录为已知问题。

解决方法是将这些目标添加到项目中。他们将从传递给SGEN的引用列表中删除DesignFacadesToFilter(并在完成SGEN后将其重新添加)

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

另一个选择(机器范围)是将以下绑定重定向添加到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.

上面关于链接问题的答案现在是相关的答案:stackoverflow.com/a/52883065/54289 有关详细信息,请参见答案 的注释。
EnocNRoll-AnandaGopal Pardue,

6

这将在.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)


4

我有同样的问题,并且唯一的方法是我能够解决它的方法是将bindingRedirect添加到app.confing如何写成@ tripletdad99。

但是,如果您有更多项目的解决方案,则实际上是手动更新每个项目(有时更新一些nuget软件包后,您需要再次执行此操作)。这就是为什么我编写了简单的powershell脚本(如果所有app.configs的原因)的原因。

 param(
    [string]$SourceDirectory,
    [string]$Package,
    [string]$OldVersion,
    [string]$NewVersion
)

Write-Host "Start fixing app.config in $sourceDirectory"
Write-Host "$Package set oldVersion to $OldVersion and newVersion $NewVersion"
Write-Host "Search app.config files.."
[array]$files = get-childitem $sourceDirectory -Include app.config App.config -Recurse | select -expand FullName
foreach ($file in $files)
{
    Write-Host $file
    $xml = [xml](Get-Content $file)
    $daNodes = $xml.configuration.runtime.assemblyBinding.dependentAssembly
    foreach($node in $daNodes)
    {
        if($node.assemblyIdentity.name -eq $package)
        {
            $updateNode = $node.bindingRedirect
            $updateNode.oldVersion = $OldVersion
            $updateNode.newVersion =$NewVersion
            Write-Host "Fix"
        }
    }
    $xml.Save($file)
}

Write-Host "Done"

示例如何使用:

./scripts/FixAppConfig.ps1 -SourceDirectory "C:\project-folder" -Package "System.Net.Http" -OldVersion "0.0.0.0-4.3.2.0" -NewVersion "4.0.0.0"

可能它不是完美的,而且如果有人将其链接到预构建任务也将更好。


3

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引用的版本来构建项目。


1

我有这个功能,但是那是因为我添加了一个NuGet程序包,该程序包更新了绑定重定向。删除软件包后,重定向仍然存在。我删除了所有这些文件,然后运行update-package -reinstall。这添加了正确的重定向。



0

对我来说,我已将项目设置为在最新版本的.Net Framework上运行(从.Net Framework 4.6.1更改为4.7.2)。

一切正常,没有错误,并且发布没有问题,这只是偶然的机会,我偶然遇到了System.Net.Http错误消息,该消息显示在网站上的一个很小的,难以通知但非常重要的API请求中,我正在努力。

我回滚到4.6.1,一切都很好。


0

彻底为我解决此问题(.NET 4.6.1)的唯一方法是,不仅为实际使用System.Net.Http的项目添加对System.Net.Http V4.3.4的Nuget引用,而且还向启动项目(在我的情况下是测试项目)。

(这很奇怪,因为正确的System.Net.Http.dll存在于测试项目的bin目录中,并且.config assemblyBingings看起来也不错。)


0

正在使用nuget更新旧网站(包括.Net更新和MVC更新)。

我删除了VS2017中的System.Net.HTTP引用(版本为2.0.0.0),然后重新添加了引用,然后显示了4.2.0.0。

然后,我使用nuget更新了很多“包”,并收到了错误消息,然后注意到某些内容将引用重置为2.0.0.0,因此我再次删除并重新添加了它,效果很好...很奇怪。

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.