无法加载文件或程序集"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个回答

4

我有同样的问题,唯一能解决它的方法是在app.confing中添加bindingRedirect,就像@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"

可能并不完美,如果有人将其链接到预构建任务中,它将更好。


2

我曾经遇到过这个问题,原因是我添加了一个NuGet包,更新了绑定重定向。一旦我移除了这个包,重定向仍然存在。我移除了所有的重定向,然后运行了update-package -reinstall命令。这样就添加了正确的重定向。


2
从web.config中删除name="System.Net.Http"的dependentAssembly对我也起作用。我在web.config中注释掉了这部分,然后它就可以工作了。 如果以上所有的解决方案对你都没有起作用,尝试按照下面所示进行注释或删除。
<!--<dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0"/>
      </dependentAssembly>-->

1

在进行技巧和配置复杂性之前,尝试删除bin和obj文件夹,然后编译。这可以解决相同的问题。


0

使用nuget(包括 .Net 和MVC 更新)更新旧网站时出现问题。

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

然后使用Nuget更新了大量的“包”,但遇到错误消息,发现某些东西已将引用重置为2.0.0.0,因此我再次删除并重新添加它,现在工作正常... 真是奇怪。


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的项目添加Nuget引用System.Net.Http V4.3.4,还要为启动项目(在我的情况下是测试项目)添加引用。
(这很奇怪,因为测试项目的bin目录中存在正确的System.Net.Http.dll,并且.config assemblyBingings看起来也没问题。)

0

对我来说,我重新添加了NuGet包,问题就解决了。


0
确保此 DLL 的 publicKeyToken 定义并符合您的期望,对于某些版本的该 DLL,它有时为空。

0

检查 .net framework 版本。
我的原始 .net framework 是旧版本。
安装了 .net framework 4.6 后,这个问题自动解决了。


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