未找到 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, Nullable1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable1 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.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【参考方案4】:

我刚刚使用 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">

&lt;HintPath&gt;其实指向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.HttpSystem.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&lt;HttpClient&gt; 从一个普通的 .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 文件中删除了&lt;runtime&gt; 标记下的所有依赖项及其绑定重定向。我构建了给我绑定错误的解决方案。单击错误后,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)?

无法加载文件或程序集“System.Net.Http.Formatting-Cosmo”

命名空间在类中找到,但在 aspx 中没有

mvc4.5更改为mvc4.0方法总结

System.Net.Http 与 Microsoft.Net.Http 的当前状态