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


108

我有一个奇怪的问题,这使我发疯…

我有一个简单的类库项目(完整的.NET Framework,4.6.1),其中包含用于Cosmos DB功能的包装类。因此,我已经向该项目添加了“ Microsoft.Azure.DocumentDB” NuGet软件包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 1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, NullableserviceEndpoint ,ConnectionPolicy connectionPolicy,可为1的requiredConsistencyLevel)

内部异常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 Service的app.config中(正在使用类库):

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

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

谢谢和问候,OliverB


3
嗨,OliverB!您是否找到解决此问题的方法?我正面临着同样的情况,这是一场噩梦:-(
user1178399

@HansPassant该链接已断开
reggaeguitar

我回答这个问题:stackoverflow.com/a/63031440/330680
Mahdi

Answers:


129

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

问题在于,VS在生成时和运行时也会忽略您的引用,并且会尝试引用它知道的DLL。

解决方法:

  • 确保通过NuGet完成对System.Net.Http的任何引用
  • 生成时间错误: 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/zh-cn/nuget/reference/migrate-packages-config-to-package-reference



6
非常感谢,在过去的几个小时里一直在疯狂尝试解决这个问题!
Flinkman

22
请注意,如果使用的是.NET 4.7.2,则可以通过实际删除bindingRedirects来解决此问题。
Alternatex

1
今天,升级到4.7.2时遇到同样的问题。System.IO.Compression和System.Runtime也受到影响。删除绑定重定向解决了该问题。
JB。和莫妮卡

7
是! 最后!按照上面的@Alternatex和JB,对于4.7.2,删除bindingRedirects,现在变成金色。找出System.Net.Http所需的最新歌曲和舞蹈例程对每个框架进行更新是多么痛苦。
Ted

76

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

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

2
那是我尝试的第一件事之一,但是没有成功
OliverB

2
删除bindingRedirect为我解决了这个问题。单元测试没有通过与OP相同的错误,现在可以工作了。
Edu

1
这是完整的代码行吗?到底需要在哪里添加呢?我的所有其他bindingRedirects在包裹标签dependentAssembly
弗洛

1
这很棒。我要补充的是,如果您的解决方案中有多个项目,请确保评估所有项目并使用此方法解决。
踏板车

1
谢谢。从2天开始就一直停留在此问题上。有效 !!!
萨加尔·哈特里

17

@AndreiU答案的附加内容以及如何在本地重现运行时错误。

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

无法加载文件或程序集'System.Net.Http,版本= 4.2.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。“,” ExceptionType“:” System.IO.FileNotFoundException“,” StackTrace“:”在Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\ r \ n在Company.Project C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs:line 30 \ r \ n中位于.lambda_method的.BackOffice.Web.Controllers.OrderController..ctor()在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,类型controllerType)处闭包)\\ r \ n 文化=中性,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。“,” ExceptionType“:” System.IO.FileNotFoundException“,” StackTrace“:”在Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\ r \ n在Company.Project C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs:line 30 \ r \ n中位于.lambda_method的.BackOffice.Web.Controllers.OrderController..ctor()在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,类型controllerType)处闭包)\\ r \ n 文化=中性,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。“,” ExceptionType“:” System.IO.FileNotFoundException“,” StackTrace“:”在Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\ r \ n在Company.Project C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs:line 30 \ r \ n中位于.lambda_method的.BackOffice.Web.Controllers.OrderController..ctor()在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,类型controllerType)处闭包)\\ r \ n

当我开始查看程序集时,我可以看到我的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 Localtrue可以解决问题,但不是在所有情况下。

在此处输入图片说明

为了在本地计算机上重现错误,只需删除所需的 System.Net.Http.dll从Visual Studio特定文件夹中。这将给您运行时错误,可能还会出现一些构建错误。这些问题解决之后,一切都应该起作用,至少对我来说是有效的。

如果已System.Net.Http通过安装,NuGet请通过查看版本来检查使用的组件.csprojSystem.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>
  <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


4
添加<dependentAssembly> <assemblyIdentity name =“ System.Net.Http” .......从我这里工作。谢谢
罗密欧

对我也是!谢谢您的解决方法!oldVersion =“ 0.0.0.0-4.2.0.0” newVersion =“ 4.1.1.3”因为我使用的是4.1.1.3
Pavel Yermalovich

重定向到4.0.0.0就是让我胜过一切的原因。谢谢!
Jim G.

向下重定向很危险!您的项目中有一个依赖项,表示它使用4.2,但是您强制它使用4.0。如果它使用的是4.0之后引入的任何新属性或方法,您将在难以预测的时间遇到​​运行时故障。
David Burg

到github线程的链接已死。但是以下线程似乎包含了相关的讨论:github.com/dotnet/runtime/issues/24382
Hermann.Gruber

5

我刚刚System.Net.Http使用NuGet 安装。您可以在这里获取:

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

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

尝试运行部署到Azure的应用程序时发生了问题。我收到此错误:

无法加载文件或程序集'System.Net.Http,版本= 4.2.0.0,区域性=中性,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>实际指向..\packages从的NuGet,也就是文件夹,这是由安装的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网站开始没有任何错误。


4

我为解决此问题所做的工作已从web.config中删除了所有绑定,并执行了

Update-Package -reinstall

这样就删除了一堆可能不需要的旧绑定,并且实际上进行了很好的清理。


2

将Web服务部署到其中一台服务器时遇到了此错误。该项目针对未安装在服务器上的.Net Framework 4.7.2。在服务器上安装4.7.2框架可解决此问题。


这也是我的问题。这也是其他版本的常见话题。
詹森·盖格

2

安德烈·乌的答案导致了我的救赎。但是,推理与我的情况不符。对于与我处境相同的人:

这是运行时错误(不是构建时间),构建成功,但是可以在一台计算机上运行,​​但不能在服务器上运行。解决方案:-添加了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的程序集重定向


1

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

我创建客户端和Web应用程序,具有.net Framework 4.7.1的客户端和具有相同功能的Web,并且遇到相同的问题,当我降级Web的目标.net框架时,它对我来说是有效的。


1

经过几天的努力,我终于为我的项目解决了.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" />

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 System.Net.Http.dll是x64。在部署此脚本之前,将dll复制到程序包目录并更改配置文件以显式使用此文件。我还在http://gertjanvanmontfoort.blogspot.nl/2017/11/systemnethttp-dll-version-problems.html上撰写了有关System.Net.Http问题的博客。

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

希望这会有所帮助,随时问


0

对我来说,真的很奇怪。发现问题所在后,需要进行数小时的调试。它不是在本地发生,而是仅在使用jenkins构建项目时发生。

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

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; }
}  

该接口位于dotnet标准库内部,而实现不在其内部(位于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项目传递给一个dotnet standart库,由于某种疯狂的原因,dotnet standart不喜欢它,也许它认为HttpClient它来自不同的类,结果抛出了System.Net.Http 4.x.x.x未找到的异常。删除代码后,不接受HttpClient普通.NET项目中的代码,而是func在库本身内部创建一个新文件,它可以正常工作。希望这可能对其他人有所帮助,因为此错误的发生原因有很多:)


0

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


0

我相信部分答案可以在Microsoft 文档中找到。

当您在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到垃圾箱。

还值得检查一下GAC,以查看程序集是否也丢失了:

 gacutil -l System.Net.Sockets

就我而言,GAC也缺少特定版本。如果DLL在GAC中,则应在程序集绑定过程中找到它。


-2

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

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

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


3
哦,天哪,请不要通过删除某些文件来破坏VS的安装。
David Burg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.