ChatGPT解决这个技术问题 Extra ChatGPT

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

我已将我的项目复制到仅安装了 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”或其依赖项之一。该系统找不到指定的文件。

该项目的软件包包括:

<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.Httpbin 文件夹中找不到该文件。

该文件的路径指向:

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 为目标还是有其他方法可以引用正确的程序集?

您是否尝试过从 NuGet 包重新安装 Web Api?
尝试了该 SO 问题中的所有建议答案。到目前为止没有任何效果。我还为我正在使用的所有 nuget 包运行了 update-package xxx -reinstall。它也不起作用。
请参考这个,稍后谢谢我stackoverflow.com/questions/50536842/…

W
Wai Ha Lee

更改我的 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>

我部署到 Azure,一次没有问题,然后 15 分钟后,连续部署给了我 OP 中所述的确切错误,并用这个精确的答案调整服务器上的 web.config 解决了我的问题。但是,我不知道为什么它第一次起作用。我没有弄乱部署之间的依赖关系。
好工作。我可以看到发生了什么,我在一个基本域项目中安装了一个包,我很确定已经安装了 System.Net.Http nuget(可能是更高的 4.1.x 版本),一旦我这样做了,我就得到了这些到处都是警告。这解决了 web 项目的问题,但是上面有人在所有项目中引用 nuget 包的建议删除了所有警告。在引用方面,我是唯一一个担心新旧 .NET 混合的人吗?这让我害怕将通常的本地 dll 引用为 nuget 包(dll 地狱)。
以下是 Microsoft 关于为什么这是正确方法的答案:github.com/dotnet/corefx/issues/25773
删除绑定重定向对我来说完全有效。
是的,只需删除 system.net.http 和 system.runtime 的行。然后事情变得很好。
W
Wai Ha Lee

请按照以下步骤操作:

将 Visual Studio 更新到最新版本(这很重要) 从 web.config 中删除所有绑定重定向 将此添加到 .csproj 文件中: true true 构建项目 在 bin 文件夹中应该有一个 (WebAppName).dll.config 文件 它应该有重定向,将这些复制到 web.config 从 .csproj 文件中删除上面的片段

它应该工作。


你必须记得从生成的文件中复制绑定重定向,所以第一次你会得到上面的错误,但是如上所述转到 bin 文件夹来获取生成的 (webappname).dll.config,复制整个重定向列表进入你的web.config,然后重新编译。这对我很有帮助,请确保您首先使用 nuget 合并工具清理尽可能多的引用。
惊人。这实际上对我有用。 @EK_AllDay 您必须将 AssemblyRedirects 复制回原始 web.config。
⭐☝ 传奇徽章当之无愧!附带说明一下,当我将 AssemblyRedirects 复制回 web.config 时,我看到 System.Net.Http 不再有绑定。所以我们假设VS现在使用的是.Net框架打包的默认程序集,而不是它自己的版本?
我花了 6 个多小时与 GAC、参考程序集、冲突版本、没有意义的版本号等.. 等等.. 然后我发现这个 Legend 徽章确实值得。这是唯一为我解决的问题。天哪,我讨厌 System.Net.Http 以及所有相关问题背后的木偶。 DLL 地狱仍然存在
将项目从 4.7.2 移动到 4.8 并得到错误。按照这些步骤操作,最终结果就是我的 web.config 中根本不需要 System.Net.Http 绑定。
R
Ram Y

在我的一个项目中,有一个具有更高版本 System.Net.Http 的 nuget 包。在我的启动项目中引用 System.Net.Http v 4.0.0 ,我刚刚在我的启动项目中安装了 System.Net.Http nuget package 并且问题解决了


我在一个解决方案中有三个项目 - 我们称它们为 ABCA 是启动项目,与 BC 无关。 CB 的测试项目。在 C 中运行我的测试失败,因为我没有参考 (System.Net.Http) 项目 A
M
Muhammad Waqas

更改以下内容:

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


根本原因:coderjony.com/blogs/…
M
Marcello B.

上面的绑定重定向对我不起作用,所以我在 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>

这适用于 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 版本。
这在 VS2019 中对我有用,将应用程序从 4.6.1 迁移到 4.7.2
我有一个作为网络作业工作的控制台应用程序项目。它在创建 SendGrid api 客户端时引发了该异常。从 app.config 中删除绑定重定向后,一切都开始工作了。谢谢你的建议,我从来没有想过。
u
user3248578

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


将此与@sajeetharan 关于使用 AutoGenerateBindingRedirects 的答案结合起来,似乎旧版本的 VS 或 nuget 包可能会留下不正确的绑定语句。一个好的清理可以帮助很多。
E
EnocNRoll - AnandaGopal Pardue

这将适用于带有 Visual Studio 2017 (15.9.4) 的 .NET 4.7.2:

删除 web/app.config 绑定重定向

删除 System.Net.Http 的 NuGet 包

打开“添加新引用”并直接链接到 .NET 4.7.2 附带的新 4.2.0.0 构建

https://i.stack.imgur.com/XAoSa.png


J
Jan Wytze

您可以通过将项目升级到 .NET Framework 4.7.2 来解决此问题。这是answered by Alex Ghiondea - MSFT。请给他点赞,因为他真的应得的!

这被记录为 .NET Framework 4.7.1 中的一个已知问题。作为一种解决方法,您可以将这些目标添加到您的项目中。他们将从传递给 SGEN 的引用列表中删除 DesignFacadesToFilter(并在 SGEN 完成后将它们添加回来) <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != '' " /> 这仅适用于具有 .NET Framework 4.7.1 的机器。安装。在该计算机上安装 .NET Framework 4.7.2 后,应删除此解决方法。


上面链接问题的这个答案现在是相关答案:stackoverflow.com/a/52883065/54289有关详细信息,请参阅答案的评论。
j
jaybro

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 版本,但这个答案实际上帮助我想到了这一点,所以谢谢:)
J
Jiri Sykora

我有同样的问题,我能够解决它的唯一方法是将 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"

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


S
SwampyFox

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


A
Alan1963

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


F
Frank Myat Thu

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


S
Stuart Aitken

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

一切正常,没有错误,发布也没有问题,我偶然发现 System.Net.Http 错误消息,显示在网站上的一个很小的、难以注意到但非常重要的 API 请求中米工作。

我回滚到 4.6.1,一切又好了。


T
TvdH

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

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


P
Paul Zahra

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

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

然后我使用 nuget 更新了大量的“包”并收到错误消息,然后注意到某些东西已将引用重置为 2.0.0.0,所以我删除并再次重新添加它工作正常......奇怪。


T
TheMah

对我来说,我再次添加了nuget,问题就解决了


R
Rajon Tanducar

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

S
Syed Nasir Abbas

打开 Web.config 并删除 包括其中的所有内容 <**runtime> 保存并关闭 Web.config 打开包管理器控制台并运行命令 Add-BindingRedirect

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅