ChatGPT解决这个技术问题 Extra ChatGPT

未找到 System.Net.Http 4.2.0.0 的奇怪问题

我有一个奇怪的问题,这让我发疯......

我有一个简单的类库项目(完整的 .NET Framework,4.6.1),其中包含一个用于 Cosmos DB 功能的包装类。因此,我将“Microsoft.Azure.DocumentDB”NuGet Package 1.19.1 添加到该项目中。除此之外,我还引用了“Newtonsoft.Json”NuGet 包 10.0.3,以及几个“Microsoft.Diagnostics.EventFlow.*”NuGet 包。

到目前为止,一切都编译没有任何错误。

但只要我点击我的包装类——从一个简单的 Service Fabric 无状态服务(完整的 .NET Framework 4.6.1)消耗——并尝试执行以下代码行:

_docClient = new DocumentClient(new Uri(cosmosDbEndpointUrl), cosmosDbAuthKey);

我在运行时收到这个奇怪的错误:

System.IO.FileNotFoundException 发生 HResult=0x80070002 消息=无法加载文件或程序集“System.Net.Http,版本=4.2.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。 Source= StackTrace:在 Microsoft.Azure.Documents.Client.DocumentClient.Initialize(Uri serviceEndpoint, ConnectionPolicy connectionPolicy, Nullable1 desiredConsistencyLevel) 在 Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable1 desiredConsistencyLevel) 内部异常 1:FileNotFoundException:无法加载文件或程序集 'System.Net.Http,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。该系统找不到指定的文件。

我完全不知道为什么根本找不到 System.Net.Http 程序集——在我的类库项目中甚至有一个对 .Net Framework 程序集“System.Net.Http 4.0.0.0”的程序集引用。

我也不明白的是,有一个奇怪的绑定重定向到 4.2.0.0——那个是从哪里来的?为了解决这个问题,我尝试将以下重定向添加到 Service Fabric 服务的 app.config(它正在使用类库):

但仍然没有区别,我仍然在运行时收到错误。

有人有线索吗?有人见过这样的问题吗?

嗨,奥利弗 B!您是否找到解决此问题的方法?我只是面临同样的情况,这是一场噩梦:-(
如果前 5 个答案对您不起作用,请参阅下面关于将程序集添加到 web.config 的编译部分的答案。

G
Ganesh Jadhav

您面临的问题与 Visual Studio 有关,尤其是与 System.Net.Http v4.2.0.0 一起提供的 2017。但是,采用新的方式,任何引用都应该通过 NuGet 完成,最新版本的 System.Net.Http 是 4.3.3 包含 dll 版本 4.1.1.2。

问题是 VS 在构建时和运行时也会忽略您的引用,它会尝试引用它知道的 DLL。

如何修复它:

确保对 System.Net.Http 的任何引用都是通过 NuGet 完成的

构建时错误:更改随 VS 2017 (c:\Program Files (x86)\Microsoft Visual Studio\2017 \Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\);如果你有不同的版本,那么路径会略有不同,但差别不大

运行时错误:添加程序集绑定重定向

如果您在 google 上在线查找,您会发现 Microsoft 对此存在一些未解决的问题,因此希望他们将来会解决此问题。

希望这可以帮助。

更新:

在寻找针对此问题的一些永久性修复以在构建代理上运行时,注意到如果您迁移到新的 NuGet PackageReference 模型(在 .csproj 中而不是在 packages.config 中)往往会更好地工作。以下是有关如何进行此升级的指南的链接:https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference


非常感谢,在过去的几个小时里一直试图解决这个问题!
请注意,如果您使用的是 .NET 4.7.2,则可以通过实际删除 bindingRedirects 来解决该问题。
今天升级到 4.7.2 时出现同样的问题。 System.IO.Compression 和 System.Runtime 也受到影响。删除绑定重定向解决了这个问题。
是的!最后!根据上面的@Alternatex 和 JB,对于 4.7.2,删除 bindingRedirects 并且现在是金色的。每次框架更新都要弄清楚 System.Net.Http 所需的最新歌舞例程是多么痛苦。
V
Vivek Sharma

删除绑定重定向对我有用,您可以尝试删除它:

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

这是我尝试的第一件事,但没有成功
删除 bindingRedirect 为我解决了这个问题。单元测试没有通过与 OP 相同的错误,现在它们可以工作了。
这是完整的代码线吗?究竟需要在哪里添加?我的所有其他 bindingRedirects 都包含在标签 dependentAssembly
这很好用。我要补充一点,如果您的解决方案中有多个项目,请确保您评估所有项目并使用此方法解决。
谢谢你。从这两天开始就一直在这个问题上。有效 !!!
a
abatishchev

@AndreiU 已经给出的答案以及如何在本地重现运行时错误的补充。

部署到 Azure 时出现以下运行时错误,而不是本地。

{“Message”:“发生错误。”,“ExceptionMessage”:“尝试创建'OrderController'类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。”,“ExceptionType”: "System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,类型 controllerType)\r\n 在 System.Web.Http.Controllers.HttpControllerDescriptor.CreateController( HttpRequestMessage 请求)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()","InnerException":{"Message":"发生错误。","ExceptionMessage":"无法加载文件或程序集 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。系统找不到指定的文件。","ExceptionType":"System.IO.FileNotFoundException ","StackTrace":" 在 Company.Project.Service.CompanyIntegrationApiService ..ctor(Uri baseAddress)\r\n 在 C:\projects\company-project\src\Company.Project.BackOffice.Web\Controllers 中的 Company.Project.BackOffice.Web.Controllers.OrderController..ctor() Order\OrderController.cs:line 30\r\n at lambda_method(Closure )\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}}

当我开始查看程序集时,我可以看到我的 Web 项目和服务项目针对 System.Net.Http 的不同版本。

网络项目:

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

服务项目:

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

很容易认为这是由于版本不匹配造成的,但这里的关键是查看错误 The system cannot find the file specified.

查看 path 属性,我们可以看到 Web 项目以 .Net Framework 程序集为目标,而服务以 Visual Studio 2017 的程序集为目标。由于服务器未安装 Visual Studio 2017,因此会发生运行时错误。

网页路径:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll

服务路径:

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

Copy Local 设置为 true 这样简单的操作可以解决问题,但并非在所有情况下都适用。

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

为了在本地计算机上重现错误,只需从 Visual Studio 特定文件夹中删除所需的 System.Net.Http.dll。这会给你运行时错误,可能还有一些构建错误。在这些被修复之后,一切都应该工作,至少它对我有用。

如果您通过 NuGet 安装了 System.Net.Http,请查看 .csproj 版本检查使用的程序集。 System.Net.Http 4.3.4 给出了以下程序集,例如:

<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
  <Private>True</Private>
</Reference>

如果您使用像 Jenkins、TeamCity 或 AppVeyor 这样的构建服务器,那么缺少的运行时 .dll 也可能存在。在这种情况下,使用 NuGet 版本的 System.Net.Http 或在本地删除缺少的 .dll 可能无济于事。要解决此错误,请查看未找到的版本和特定的 PublicKeyToken。之后,根据您的项目在 Web.configApp.config 中创建绑定重定向。就我而言,我想改用 4.0.0.0 :

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

关于这个问题的一个很好的 Github 线程:

https://github.com/dotnet/corefx/issues/22781


添加
对我来说也是!感谢您的解决方法! oldVersion="0.0.0.0-4.2.0.0" newVersion="4.1.1.3" 因为我使用的是 4.1.1.3
重定向到 4.0.0.0 让我脱颖而出。谢谢!
向下重定向很危险!您的项目中有一个依赖项,表明它使用 4.2,但您强制它使用 4.0。如果它使用 4.0 后引入的任何新属性或方法,您将在难以预测的时间遇到运行时故障。
github线程的链接已死。但以下线程似乎包含相关讨论:github.com/dotnet/runtime/issues/24382
L
Leniel Maccaferri

我刚刚使用 NuGet 安装了 System.Net.Http。你可以在这里抓住它:

https://www.nuget.org/packages/System.Net.Http/

我正在处理的 ASP.NET MVC 项目以 .NET 4.6.1 为目标。在使用 Visual Studio 2019 在 IIS Express 中进行调试时,它可以在我的机器上完美运行。

尝试运行部署到 Azure 的应用程序时出现问题。我收到了这个错误:

无法加载文件或程序集 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。

在我的情况下真正起作用的是打开 .csproj 文件并搜索 System.Net.Http,如下面的屏幕截图所示......

https://i.stack.imgur.com/JObUK.jpg

看到 .csproj 文件具有版本 4.1.1.3

<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">

<HintPath>实际上指向Nuget中的..\packages文件夹,也就是Nuget安装的真实版本。部署后,此特定版本也将在服务器端恢复,并且所有内容都应使用绑定重定向。

...因此 绑定重定向 应在 Web.config 中提及此特定版本,如下所示:

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

这在我提交了几次 Azure Kudu 后解决了我的问题。 Azure 网站终于启动,没有出现任何错误。


J
Jamie R Rytlewski

我为解决这个问题所做的工作是从 web.config 中删除了所有绑定并做了一个

Update-Package -reinstall

这删除了一堆可能不需要在那里的旧绑定,实际上做了很好的清洁。


M
Mark Willis

当我将 Web 服务部署到我们的一台服务器时,我遇到了这个错误。该项目针对未安装在服务器上的 .Net 框架 4.7.2。在服务器上安装 4.7.2 框架更正了该问题。


这也是我的问题。对于其他版本,这也是一个反复出现的话题。
S
Sam

Andrei U 的回答导致了我的救赎。但是,推理与我的情况不符。对于与我处于相同情况的人:

这是一个运行时错误(不是构建时间),构建成功,但可以在一台计算机上运行,但不能在服务器上运行。解决方案: - 添加 System.Net.Http 包。 - 重命名文件:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2\System.Net.Http.dll(例如重命名为:System.Net.Http.dll.BAK)构建服务器。

我没有并且仍然没有此 dll 的程序集重定向


P
P.Brian.Mackey

我相信部分答案可以在微软的documentation中找到。

在 Visual Studio 中创建面向 .NET Framework 4.5.1 或更高版本的桌面应用时,该应用使用自动绑定重定向。

正如@Vivek Sharma 的回答所指出的,删除:

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

在我的应用程序中解决了 3 个此类情况下的问题。当您使用 Powershell 检查 DLL 时,例如:

 ([system.reflection.assembly]::loadfile("C:\MyApp\bin\System.Net.Sockets.dll")).FullName

输出

System.Net.Sockets,版本=4.0.0.0

显然,绑定重定向到 4.2.0.0 不起作用,因为我们将 4.0.0.0 输出到 bin。

还值得检查 GAC 以查看那里是否也缺少程序集:

 gacutil -l System.Net.Sockets

就我而言,GAC 也缺少特定版本。如果 DLL 在 GAC 中,那么它应该是 found in the assembly binding process


C
CrnaStena

除了上面的许多建议外,这对我有用:

删除 Nuget 包 4.3.4(我不得不降级另一个需要它的包)添加 System.Net.Http 作为参考(版本 4.2.0.0) 删除 bindingRedirect 将 System.Net.Http 添加到 Web.config 中的编译部分.

如果您有区域,请将其添加到其 Web.config 中。至少我必须在我的代码中。


这解决了我关于它在本地 VS 上工作但在 Azure DevOps 中不起作用的问题。
R
Raquib

我发现一个简单的解决方案是将 Web 项目的目标框架降级到 4.6。

我创建客户端和 Web 应用程序,客户端具有 .net 框架 4.7.1,而 Web 具有相同的框架,我面临同样的问题,当我为 Web 降级目标 .net 框架时,它对我有用。


B
Bruno

我的解决方案类似于@Raquib 的。我的项目是 4.7.2,在我的 PC 上运行良好。每当我部署到我们的开发服务器时,我都会遇到问题中提到的问题。原来服务器上的最高 .net 版本是 4.6.1。将我的项目降级到 4.6.1 解决了这个问题。升级服务器的 .net 版本对我来说不是一个选择。


U
Umar Topia

我尝试了各种解决方案(删除dependentAssembly 或指定绑定重定向)。他们都没有工作。

但是,唯一对我有用的解决方案是从 Visual Studio 将 System.Net.Http (或任何给您版本问题的 DLL)的特定版本显式设置为 False。

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


这对我来说适用于一个多目标不同框架的项目,即net472、net72等
H
Harish Ninge Gowda

我遇到了类似的问题,并遇到了很多困难解决了它。我正在使用 Visual Studio 2019

删除对 System.Net 的任何程序集引用。*(任何以 System.Net 开头的包)卸载所有以 System.Net 开头的包。* 从包管理器安装 Microsoft.AspNet.WebApi.Client 以上应该可以解决您的问题。无论如何,您仍然有问题。 Intellisense 会建议您添加对 System.Net.Http 的引用,单击添加引用。就我而言,它建议两个参考 System.Net.Http 和 System.Net.Http.Formatting。单击添加后,它工作正常。


B
Ben Bradley

我有一个类似的问题。尝试删除 System.Net.Http NuGet 包(版本 4.1.1.2)失败,因为它被标记为我正在使用的其他包的先决条件。

我尝试删除此处的几个答案中提到的所有绑定重定向。虽然这本身不起作用,但我继续进行以下操作。

在我所有项目下的 References 节点中,我从 NuGet 包中删除了指向 System.Net.Http.dll 的链接,并从 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4 添加了一个。 6.1\System.Net.Http.dll

随着所有这些引用的更改并且没有绑定重定向构建和运行的项目。


u
user8862383

我有同样的问题。最后,我通过将 Deploy-FabricApplication.ps1 更改为类似这样的方式解决了这个问题

$binFolder = "$LocalFolder\..\..\..\..\Bin"

$httpDllLocation = "$binFolder\System.Net.Http.dll"
$codeFolder = "$ApplicationPackagePath\[ProjectName].ServicesPkg\Code"
$configFile = "$codeFolder\[ProjectName].Services.exe.config"

Copy-Item $httpDllLocation -Destination $codeFolder 

$appConfig = [xml](cat $configFile)
$appConfig.configuration.runtime.assemblyBinding.dependentAssembly | foreach {

    $name = $_.assemblyIdentity.name
    #Write $name
    if($name -eq 'System.Net.Http')
    {
        Write 'System.Net.Http changed'

        $_.bindingRedirect.newVersion = '4.2.0.0'
    }
}
$appConfig.Save($configFile)

我找到了一个 x64 的 4.2.0.0 System.Net.Http.dll。在部署此脚本之前,将 dll 复制到包目录并更改配置文件以显式使用此文件。我还在 http://gertjanvanmontfoort.blogspot.nl/2017/11/systemnethttp-dll-version-problems.html 写了一篇关于我的 System.Net.Http 问题的博客

不要忘记将 [ProjectName] 替换为您自己的项目名称

希望对你有帮助,欢迎提问


D
Doug Boone

经过几天的努力,我终于为我的项目解决了 .Net 4.7.2/System.Net.Http 问题。除了将 *.csproj 文件更改为以框架版本 4.7.2 为目标之外,我还必须更新项目中的 app.config

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />

至:

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />

v
vr_driver

一夜之间,我们的应用程序停止向我们的第三方提供商上传数据。我目前正在使用 VS 2017 15.9.27 并且我的错误“进程失败:底层连接已关闭:发送时发生意外错误。”来自这一行:

Dim stream As IO.Stream = request.GetRequestStream

来自此的请求:

Dim request As Net.HttpWebRequest = Net.HttpWebRequest.Create(uri)

我做了两件事来解决这个问题。我将 .NET 的最新版本升级到 4.6.1,现在产生了以下错误:

"Could not load file or assembly 'System.Net.Http, Version=4.2.0.0," 

为了解决新创建的问题,我删除了包“System.Net.Http”,而是通过 NuGet 将其添加回 4.3.4。

我怀疑它可能是证书或协议问题,因为它安装了以下以前不存在的安全参考:

System.Security.Cryptography.Algorithms (>= 4.3.0)
System.Security.Cryptography.Encoding (>= 4.3.0) 
System.Security.Cryptography.Primitives (>= 4.3.0)
System.Security.Cryptography.X509Certificates (>= 4.3.0)

m
mycroes

对我来说,这真的很奇怪。发现问题后需要数小时的调试。它并没有在本地发生,而是仅在使用 Jenkins 构建项目时发生。

我有一个使用 netstandard 2.0 的小型库,主要项目是基于普通 .NET 的 WCF 项目(我的特别是 v4.6.1)。但是在 netstandard 库的启动类中,我有一些看起来像这样的代码:

public static class CoreModule
{
    public static IServiceCollection AddStaticDataConfiguration(
        this IServiceCollection services, Func<IServiceProvider, IStaticDataConfiguration>  staticDataConfiguration) 
    {  
        services.TryAddSingleton(staticDataConfiguration);
        services.TryAddSingleton<Func<HttpClient>>(x =>
        {
            var configuration = staticDataConfiguration(x);

            return configuration.ClientResolver ?? (() => new HttpClient());
        });
        return services;
    }
}

IStaticDataConfiguration 接口如下所示:

public interface IStaticDataConfiguration
{
    //..... some stuff

    Func<HttpClient> ClientResolver { get; set; }
}  

该接口位于 netstandard 库内部,而实现位于其外部(位于 WCF 项目中)。

我从库外部调用 AddStaticDataConfiguration 方法,如下所示:

serviceCollection.AddStaticDataConfiguration(p =>
{
    var staticDataConfig = p.GetService<IStaticDataConfiguration>();
    return new StaticDataProviderConfiguration
    {
        //...some other stuff
        ClientResolver = () => restRequestFactory.GetInstrumentedClient("StaticDataService") //this returns an HttpClient
    };
});

问题是我将 Func<HttpClient> 从普通 .NET 项目传递到 netstandard 库,由于某种疯狂的原因 netstandard 不喜欢它,也许它认为 HttpClient 来自不同的类,结果抛出 System.Net.Http 4.x.x.x未发现异常。当删除代码以不接受来自普通 .NET 项目的 HttpClient 但在库本身内创建新的 func 时,它很高兴并且工作正常。希望这可能对其他人有所帮助,因为发生此错误的原因有很多:)


J
Jadran Grba

我使用的是 .net 4。我的“System.Net.Http”引用指向 dll 的“.net 4.7”版本。所以我将 .dll 路径更改为指向“Microsoft.Net.Http”包并重建它。这解决了我的问题。

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


f
fiffens

解决方案在多台开发机器上编译和运行良好,除了在运行项目时出现此错误的机器。删除所有文件并从 TFS 中检索它们没有帮助。

Visual Studio 修复解决了它。

从 Visual Studio 安装程序执行修复。

Visual Studio 2019 版本 16.11.5


a
alamoot

就我而言,我从 .config 文件中删除了 <runtime> 标记下的所有依赖项及其绑定重定向。我构建了给我绑定错误的解决方案。单击错误,VS 仅根据需要填充依赖项及其重定向,并且能够在之后运行解决方案。


B
Bogdan M.

对我有用的是将 System.Net.Http 降级到 4.0 版,以便所有包和依赖项都使用相同的版本:

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

我从 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.ExtensionsC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 的所有子文件夹中删除了 System.Net.Http.dll。


S
Shadab Shamim

作为一种解决方法,我安装了 System.Buffer 4.5.0 版本,它依赖于 System.Net.Http dll 版本 4.2.0.0。因此,安装后,您将在项目的 bin 文件夹中看到具有上述版本的 System.Net.Http dll。对于此类问题,这是一个简单的解决方法。


O
Obsidian

首先从本地文件系统中删除:

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

然后删除项目中的所有引用,并添加 4.0 引用。这解决了我的问题。


哦,我的不,请不要通过删除某些文件来破坏您的 VS 安装。
真是个好主意。我想知道我怎么没有想到这个。 :)