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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找不到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 Package 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,Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。该系统找不到指定的文件。 Source = StackTrace:at 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,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

答案

您遇到的问题与Visual Studio有关,特别是2017年与System.Net.Http v4.2.0.0一起提供。但是,采用通过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的扩展(或将其移动到其他地方......基本上摆脱它);如果你有不同的版本,那么路径会略有不同,但并不多
  • 运行时错误:添加程序集绑定重定向

如果你在谷歌上看到你会发现微软有一些与此有关的未解决的问题,所以希望他们将来能解决这个问题。

希望这可以帮助。

更新:

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

另一答案

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

另一答案

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

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

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

另一答案

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

<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
另一答案

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

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

“Message”:“发生错误。”,“ExceptionMessage”:“尝试创建'OrderController'类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。”,“ExceptionType”: “System.InvalidOperationException”,“StackTrace”:“at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type 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在C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \的Company.Project.BackOffice.Web.Controllers.OrderController..ctor()中的..ctor(Uri baseAddress)\ r \ n Order \ OrderController.cs:第30行\ r \ n在lambda_method(Closure)\ r \ n在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType)“

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

网站项目:

enter image description here

服务项目:

enter image description here

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

查看路径属性,我们可以看到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这样简单的事情可以解决问题,但并非在所有情况下都能解决问题。

enter image description here

要在本地计算机上重现错误,只需从Visual Studio特定文件夹中删除所需的System.Net.Http.dll即可。这将为您提供运行时错误以及可能的一些构建错误。修复后,一切都应该有效,至少它对我有用。

如果您通过System.Net.Http安装了NuGet,请查看.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>
  <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

另一答案

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

另一答案

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

Update-Package -reinstall

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

另一答案

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

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

另一答案

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

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>

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