未找到 System.Net.Http 4.2.0.0 的奇怪问题
Posted
技术标签:
【中文标题】未找到 System.Net.Http 4.2.0.0 的奇怪问题【英文标题】:Strange issue with System.Net.Http 4.2.0.0 not found 【发布时间】:2017-11-30 10:15:41 【问题描述】:我有一个奇怪的问题,让我发疯……
我有一个简单的类库项目(完整的 .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' 或 它的依赖项之一。系统找不到指定的文件。 来源= StackTrace:在 Microsoft.Azure.Documents.Client.DocumentClient.Initialize(Uri serviceEndpoint, ConnectionPolicy connectionPolicy, Nullable
1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable
1 desiredConsistencyLevel)内部异常 1:FileNotFoundException:无法加载文件或 程序集'System.Net.Http,版本=4.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。这 系统找不到指定的文件。
我完全不知道为什么根本找不到 System.Net.Http 程序集——在我的类库项目中甚至有一个对 .Net 框架程序集“System.Net.Http 4.0.0.0”的程序集引用.
我也不明白的是,有一个奇怪的绑定重定向到 4.2.0.0——那个是从哪里来的? 为了解决这个问题,我尝试将以下重定向添加到 Service Fabric 服务的 app.config(它正在使用类库):
但仍然没有区别,我仍然在运行时收到错误。
有人知道吗?有人见过这样的问题吗?
【问题讨论】:
嗨,奥利弗B!您是否找到解决此问题的方法?我只是面临同样的情况,这是一场噩梦:-( 我回答这个问题:***.com/a/63031440/330680 如果前 5 个答案对您不起作用,请参阅下面关于将程序集添加到 web.config 的编译部分的答案。 【参考方案1】:您面临的问题与 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\
) 提供的 System.Net.Http.dll 的扩展名(或将其移至其他地方...基本上摆脱它);如果您有不同的版本,那么路径会略有不同,但差别不大
运行时错误:添加程序集绑定重定向
如果您在 google 上在线查看,您会发现 Microsoft 对此存在一些未解决的问题,因此希望他们将来会解决此问题。
希望这会有所帮助。
更新:
在寻找针对此问题的一些永久性修复以在构建代理上运行时,注意到如果您迁移到新的 NuGet PackageReference 模型(在 .csproj
中而不是在 packages.config
中)往往会更好地工作。这是有关如何进行此升级的指南的链接:https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference
【讨论】:
似乎他们在 net472 github.com/Microsoft/dotnet-framework-early-access/blob/master/… 中遇到了问题 非常感谢,过去几个小时一直在努力解决这个问题! 请注意,如果您使用的是 .NET 4.7.2,则可以通过实际删除 bindingRedirects 来解决该问题。 今天升级到 4.7.2 时同样的问题。 System.IO.Compression 和 System.Runtime 也受到影响。删除绑定重定向解决了这个问题。 是的!最后!根据上面的@Alternatex 和 JB,对于 4.7.2,删除 bindingRedirects 并且现在是金色的。每次框架更新都要弄清楚 System.Net.Http 所需的最新歌舞例程是多么痛苦。【参考方案2】:删除绑定重定向对我有用,您可以尝试删除它:
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
【讨论】:
这是我尝试的第一件事,但没有成功 删除 bindingRedirect 为我解决了这个问题。单元测试没有通过与 OP 相同的错误,现在它们可以工作了。 这是完整的代码行吗?究竟需要在哪里添加?我所有其他 bindingRedirects 都包含在标签dependentAssembly
中
这很好用。我要补充一点,如果您的解决方案中有多个项目,请确保评估所有项目并使用此方法解决。
谢谢。从这两天开始就一直在这个问题上。成功了!!!【参考方案3】:
补充@AndreiU 已经给出的答案以及如何在本地重现运行时错误。
部署到 Azure 时出现以下运行时错误,而不是本地。
"Message":"发生错误。","ExceptionMessage":"错误 尝试创建类型为“OrderController”的控制器时发生。 确保控制器有一个无参数的公共 构造函数。","ExceptionType":"System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 控制器类型)\r\n 在 System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求)\r\n 在 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":" 在 Company.Project.Service.CompanyIntegrationApiService..ctor(Uri 基本地址)\r\n 在 Company.Project.BackOffice.Web.Controllers.OrderController..ctor() 在 C:\projects\company-project\src\Company.Project.BackOffice.Web\Controllers\Order\OrderController.cs:line 30\r\n at lambda_method(Closure )\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 控制器类型)"
当我开始查看程序集时,我可以看到我的 Web 项目和服务项目针对 System.Net.Http
的不同版本。
网络项目:
服务项目:
很容易认为这是版本不匹配造成的,但这里的关键是看错误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
这样简单的操作可以解决问题,但并非在所有情况下都可以。
为了在本地计算机上重现错误,只需从 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.config
或App.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
【讨论】:
添加我刚刚使用 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,版本=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其之一 依赖关系。
在我的情况下真正起作用的是打开 .csproj 文件并搜索 System.Net.Http
,如下面的屏幕截图所示......
看到.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 网站终于顺利启动了。
【讨论】:
【参考方案5】:我为解决这个问题所做的是从 web.config 中删除了所有绑定并做了一个
Update-Package -reinstall
这删除了一堆可能不需要的旧绑定,实际上进行了很好的清理。
【讨论】:
【参考方案6】:我在将 Web 服务部署到我们的一台服务器时遇到了这个错误。该项目针对未安装在服务器上的 .Net 框架 4.7.2。在服务器上安装 4.7.2 框架解决了这个问题。
【讨论】:
这也是我的问题。对于其他版本,这也是一个反复出现的话题。【参考方案7】: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 的程序集重定向
【讨论】:
【参考方案8】:相信部分答案可以在微软的documentation中找到。
当您在 Visual Studio 中创建面向 .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,版本=4.0.0.0
显然绑定重定向到4.2.0.0
是行不通的,因为我们将4.0.0.0
输出到垃圾箱。
还值得检查 GAC,看看那里是否也缺少程序集:
gacutil -l System.Net.Sockets
就我而言,GAC 也缺少特定版本。如果 DLL 在 GAC 中,那么它应该是 found in the assembly binding process。
【讨论】:
【参考方案9】:我发现了一个简单的解决方案,将 Web 项目的目标框架降级到 4.6。
我创建客户端和 Web 应用程序,客户端具有 .net 框架 4.7.1,而 Web 具有相同的框架,我面临同样的问题,当我为 Web 降级目标 .net 框架时,它对我有用。
【讨论】:
【参考方案10】:我的解决方案类似于@Raquib 的解决方案。我的项目是 4.7.2,在我的 PC 上运行良好。每当我部署到我们的开发服务器时,我都会遇到问题中提到的问题。原来服务器上的最高 .net 版本是 4.6.1。将我的项目降级到 4.6.1 解决了这个问题。升级服务器的 .net 版本对我来说不是一个选项。
【讨论】:
【参考方案11】:除了上面的许多建议外,这对我有用:
删除 Nuget 包 4.3.4(我不得不降级另一个需要它的包)
添加System.Net.Http
作为参考(版本 4.2.0.0)
移除绑定重定向
将System.Net.Http
添加到Web.config
(s) 中的编译部分。
<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 中。至少我必须在我的代码中。
【讨论】:
【参考方案12】:我尝试了各种解决方案(删除dependentAssembly 或指定绑定重定向)。他们都没有工作。
但是,唯一对我有用的解决方案是从 Visual Studio 将 System.Net.Http(或任何给您版本问题的 DLL)的特定版本显式设置为 False。
【讨论】:
这对我来说适用于一个多目标不同框架的项目,即 net472、net72 等【参考方案13】:我遇到了类似的问题,并且遇到了很多困难解决了它。我正在使用 Visual Studio 2019
-
删除对 System.Net.*(任何以 System.Net 开头的包)的任何程序集引用
卸载所有以 System.Net.* 开头的包
从包管理器安装
Microsoft.AspNet.WebApi.Client
以上内容应该可以解决您的问题。无论如何,您仍然有问题。 Intellisense 会建议您添加对System.Net.Http
的引用,点击添加引用。
在我的例子中,它建议两个引用 System.Net.Http
和 System.Net.Http.Formatting
。点击添加后效果很好。
【讨论】:
【参考方案14】:我遇到了类似的问题。尝试删除 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
所有这些引用都更改了,并且没有绑定重定向构建和运行的项目。
【讨论】:
【参考方案15】:我遇到了同样的问题。最后,我通过将 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] 替换为您自己的项目名称
希望对你有帮助,欢迎提问
【讨论】:
【参考方案16】:在为此苦苦挣扎了几天后,我终于为我的项目解决了 .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" />
【讨论】:
【参考方案17】:一夜之间,我们的应用程序停止向我们的第三方提供商上传数据。 我目前正在使用 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)
【讨论】:
【参考方案18】:对我来说真的很奇怪。发现问题后需要数小时的调试。它并没有在本地发生,而是仅在使用 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
时,它很高兴并且工作正常。
希望这可能对其他人有所帮助,因为发生此错误的原因有很多:)
【讨论】:
【参考方案19】:我使用的是 .net 4。我的“System.Net.Http”引用指向 dll 的“.net 4.7”版本。所以我将 .dll 路径更改为指向“Microsoft.Net.Http”包并重建它。这解决了我的问题。
【讨论】:
【参考方案20】:解决方案在多台开发机器上编译和运行良好,但在运行项目时出现此错误的机器除外。删除所有文件并从 TFS 中检索它们没有帮助。
Visual Studio 修复解决了它。
从 Visual Studio 安装程序进行修复。
Visual Studio 2019 版本 16.11.5
【讨论】:
【参考方案21】:就我而言,我从.config
文件中删除了<runtime>
标记下的所有依赖项及其绑定重定向。我构建了给我绑定错误的解决方案。单击错误后,VS 仅根据需要填充依赖项及其重定向,并且能够在之后运行解决方案。
【讨论】:
【参考方案22】:首先从本地文件系统中删除:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\Syste.Net.Http.dll
然后删除项目中的所有引用并添加 4.0 引用。 这解决了我的问题。
【讨论】:
哦,不,请不要通过删除某些文件来破坏您的 VS 安装。 真是个好主意。我想知道我怎么没有想到这个。 :)以上是关于未找到 System.Net.Http 4.2.0.0 的奇怪问题的主要内容,如果未能解决你的问题,请参考以下文章
未能加载文件或程序集“System.Net.Http, Version=4.2.0.0,。。。”或它的某一个依赖项
我从哪里引用缺少的程序集(System.Net.Http.Formatting)?