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

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

我有一个简单的类库项目(完。NET Framework,4.6.1)提供了一个围绕 Cosmos DB 的包装类。因此,我加入了「微软。天蓝色。这个项目的“ DocumentDB”NuGet 包1.19.1。除此之外,我还提到了“牛顿软件”。Json“ NuGet Package 10.0.3,以及两个“ Microsoft”。诊断。EventFlow.* “ NuGet Packages”。

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

但是一旦我打开包装器类-从一个简单的 ServiceFabric 无状态服务(Full。NET Framework 4.6.1)-并尝试执行以下代码行:

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

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

异常发生 HResult = 0x80070002
无法加载文件或程序集“ System.Net.Http, 版本 = 4.2.0.0,文化 = 中性,PublicKeyToken = b03f5f7f11d50a3a’或 系统找不到指定的文件。
Source = StackTrace: at 微软。 Azure。文档。客户端。文档客户端。初始化(Uri ServiceEndpoint,ConnectionPolicy ConnectionPolicy,Nullable1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable1刻意保持一致级别)

内部异常1: FileNotFoundException: 无法加载文件或 汇编‘ System.Net.Http,版本 = 4.0.0.0.0,文化 = 中性, PublicKeyToken = b03f5f7f11d50a3a’或其依赖项之一 系统无法找到指定的文件。

我完全不知道,为什么系统。网。根本找不到 Http 程序集-在我的类库项目中甚至有一个程序集引用。网络框架装配”系统。网。Http 4.0.0.0”。

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

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

有人知道吗? 有人见过这样的问题吗?

123261 次浏览

移除绑定重定向对我来说很管用,你可以试着移除它:

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

我也遇到了同样的问题,最后我通过将 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)

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

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

希望这对你有帮助,尽管问

您面临的问题与 VisualStudio 有关,特别是与 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\)一起发布的 Http.dll (或者将其移动到其他地方... ... 基本上可以删除它) ; 如果您有一个不同的版本,那么路径将略有不同,但不会有太大差异
  • 运行时错误: 添加程序集绑定重定向

如果你在谷歌上搜索一下,你会发现微软在这个问题上还有一些未解决的问题,所以希望他们将来能够解决这个问题。

希望这个能帮上忙。

更新:

在查找针对构建代理的问题的永久性修复程序时,请注意,如果迁移到新的 NuGet PackageReference 模型(在 .csproj中而不是在 packages.config中) ,往往会工作得更好。这里有一个关于如何进行这种升级的指南的链接: https://learn.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference

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

在部署到 Azure 时,我得到了下面的运行时错误,而不是本地错误。

{“消息”: “发生了一个错误。”,“例外消息”: “一个错误 当试图创建类型为“ OrderController”的控制器时发生。 确保控制器具有无参数的公共 ,“ ExceptionType”: “ System.InvalidOperationException”,“ StackTrace”: “ 在 DefaultHttpControllerActivator.Create (HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 控制器类型) r n at System.Web.Http.Controller.HttpControllerDescriptor.CreateController (HttpRequestMessage 请求) System.Web.Http.Dispatcher. HttpControllerDispatcher.d _ _ 1. MoveNext ()”,“ InnerException”: {“ Message”: “ An ”,“ ExceptionMessage”: “无法加载文件或 汇编‘ System.Net.Http,版本 = 4.2.0.0,文化 = 中性, PublicKeyToken = b03f5f7f11d50a3a’或其依赖项之一 系统无法找到该文件 “ ,“ ExceptionType”: “ System.IO.FileNotFoundException”,“ StackTrace”: “ 在公司。项目。服务 BaseAddress) r n at 公司。项目。后台办公。网络。控制器 项目公司-项目 src 公司。项目。后台办公。网络控制器订单 ordercontroller.cs : 30 rn at lambda _ method (Closure) rn at DefaultHttpControllerActivator.Create (HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 {“}}

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

网上计划:

enter image description here

服务项目:

enter image description here

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

查看 path 属性,我们可以看到 Web 项目的目标是。程序集,而服务的目标是 VisualStudio2017中的程序集。由于服务器没有安装 VisualStudio2017,将发生运行时错误。

网址:

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这样简单的事情可以解决这个问题,但不是在所有情况下。

enter image description here

要在本地计算机上重现此错误,只需从 VisualStudio 特定文件夹中删除所需的 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 可能没有帮助。网。或者在本地删除丢失的 .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

当我将一个 Web 服务部署到我们的一个服务器时,我遇到了这个错误。这个项目的目标是。Net Framework 4.7.2,没有安装在服务器上。在服务器上安装4.7.2框架纠正了这个问题。

我所做的修复问题的工作是从 web.config 中删除所有绑定并执行

Update-Package -reinstall

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

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

我创建客户端和 Web 应用程序,客户端有。Net Framework 4.7.1和 web 有相同的问题,当我降低目标的时候,我也面临同样的问题。网络框架为网络它的工作为我。

对我来说真的很奇怪。发现问题后需要几个小时的调试。它没有发生在本地,但只有当使用詹金斯建立项目。

我有一个使用 netstandard 2.0的小型库,主要的项目是 WCF 项目,它是基于正常的。NET (我的版本是 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 项目到一个网标库,由于一些疯狂的原因网标不喜欢,可能它认为 HttpClient是来自不同的类,因此扔 System.Net.Http 4.x.x.x没有发现异常。当删除代码时,不接受一个正常的 HttpClient。NET 项目,但创建一个新的 func内部的库本身它的快乐和工作良好。 希望这可以帮助其他人,因为这个错误的发生有很多原因:)

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

我刚用 NuGet 安装了 System.Net.Http,你可以在这里找到它:

Https://www.nuget.org/packages/system

我正在做的 ASP.NET MVC项目的目标是 .NET 4.6.1。在使用 VisualStudio2019在 IIS Express中进行调试时,它在我的机器上运行良好。

当试图运行部署到 Azure 的应用程序时,出现了这个问题:

无法加载文件或程序集“ System.Net.Http,版本 = 4.2.0.0, 区域性 = 中性,PublicKeyToken = b03f5f7f11d50a3a’或其中一个 依赖关系。

在我的例子中,真正起作用的是打开.csproj 文件并搜索 System.Net.Http,如下面的截图所示..。

enter image description here

请注意 .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>

这修复了在我的案例中提交到 天蓝 Kudu几次之后的问题。Azure 网站最终没有出现任何错误。

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

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

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

经过几天的努力,我终于得到了。净值4.7.2/系统。网。修复了我的项目的 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" />

安德烈的回答使我得到了救赎,然而,这个理由与我的情况并不相符。 对于那些和我处境相同的人来说:

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

我没有,现在仍然没有这个 dll 的程序集重定向

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

在 VisualStudio 中创建以.NET 为目标的桌面应用程序时 框架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,Version = 4.0.0.0

显然,到 4.2.0.0的绑定重定向不会起作用,因为我们正在将 4.0.0.0输出到容器中。

同样值得检查一下 GAC,看看组件是否也从那里丢失了:

 gacutil -l System.Net.Sockets

在我的案例中,GAC 也缺少特定的版本。如果 DLL 在 GAC 中,那么它应该是 在装配绑定过程中找到

除了上面提到的许多建议,下面的方法对我很有效:

  1. 删除 Nuget 软件包4.3.4(我不得不降级另一个需要它的软件包)

  2. 添加 System.Net.Http作为参考(版本4.2.0.0)

  3. 删除 bindingRedirect

  4. System.Net.Http添加到 Web.config中的编译部分。

    <system.web>
    <compilation debug="false" targetFramework="4.8">
    <assemblies>
    <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.8"/>
    </system.web>
    

如果你有“区域”,也把它添加到他们的 Web.config 中。

一夜之间,我们的应用程序停止向第三方提供商上传数据。 我目前正在使用 VS 201715.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。网。而是通过 NuGet 将其添加回4.3。

我怀疑这可能是一个证书或协议问题,因为它安装了以下安全引用,以前没有:

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)

我尝试了各种解决方案(删除 DependentAssembly 或指定绑定重定向) ,但没有一个奏效。

但是,对我来说唯一有效的解决方案是显式地设置“系统的特定版本”。网。从 VisualStudio 中将 Http (或任何提供版本问题的 DLL)转换为 False。

enter image description here

我也遇到过类似的问题,但是很多困难都解决了。我使用的是 VisualStudio2019

  1. 删除对 System.Net. * (以 System.Net 开头的任何包)的任何程序集引用
  2. 卸载以 System.Net. * 开始的所有包
  3. 从包管理器安装 Microsoft.AspNet.WebApi.Client
  4. 以上应该修复您的问题。无论如何,你还是有问题。Intellisense 将建议您添加对 System.Net.Http的引用,单击 add reference。
  5. 在我的情况下,它建议两个参考 System.Net.HttpSystem.Net.Http.Formatting。后点击添加它工作得很好。

我也有过类似的问题。正在尝试删除系统。网。Http NuGet 包(版本4.1.1.2)失败,因为它被标记为我正在使用的其他包的先决条件。

我尝试删除这里的几个答案中提到的所有绑定重定向。虽然这本身并不起作用,我还是继续下面的内容。

在所有项目下的 References 节点中,我删除了到 System 的链接。网。来自 NuGet 包的 Http.dll,并添加了来自 C: Program Files (x86) Reference Assembly Microsoft Framework.NETFramework v4.6.1 System 的 Http.dll。网。Http.dll

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

我在吸毒。净值4。还有我的系统。网。Http’引用指向 dll 的“ .net 4.7”版本。所以我改了。指向微软的 dll 路径。网。重新包装并重建它。这解决了我的问题。

enter image description here

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

VisualStudio 修复程序解决了这个问题。

从 VisualStudioInstaller 执行修复。

Visual Studio 2019 版本16.11.5

在我的示例中,我从 .config文件中删除了 <runtime>标记下的所有依赖项和它们的绑定重定向。我构建了导致绑定错误的解决方案。单击该错误,VS 只在需要时填充依赖项和它们的重定向,并且能够在此之后运行解决方案。

对我有用的是降低系统的等级。网。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>

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

作为解决方案 我安装了系统。依赖于 System 的 Buffer4.5.0版本。网。Http dll 版本4.2.0.0。因此,安装后,您将看到系统。网。在项目的 bin 文件夹中使用以上版本的 Http dll。这是解决此类问题的简单方法。

在我的例子中,我只是从 app.config 中删除了一些程序集引用,它就工作了。

<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.6" newVersion="6.0.0.6" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.1.1.3" newVersion="4.1.1.3" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.IdentityModel.Abstractions" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.24.0.0" newVersion="6.24.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>