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

Oli*_*erB 79 .net dotnet-httpclient visual-studio-2017 service-fabric-stateless

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

我有一个简单的类库项目(完整的.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);
Run Code Online (Sandbox Code Playgroud)

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

发生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 1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, NullableserviceEndpoint ,ConnectionPolicy connectionPolicy,Nullable 1 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

And*_*i U 105

您遇到的问题与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

  • 如果您正在使用.NET 4.7.2,那么实际上删除bindingRedirects可能会解决问题. (16认同)
  • 非常感谢,在过去的几个小时里一直试图解决这个问题! (5认同)
  • 是! 最后!按照上面@Alternatex和JB的说明,对于4.7.2删除bindingRedirects,现在是金色的.每个框架更新的痛苦都是为了确定System.Net.Http所需的最新歌曲和舞蹈例程. (5认同)
  • 今天升级到 4.7.2 时出现同样的问题。System.IO.Compression 和 System.Runtime 也受到影响。删除绑定重定向解决了问题。 (3认同)

Viv*_*rma 49

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

<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
Run Code Online (Sandbox Code Playgroud)

  • 这是我尝试的第一件事之一,但没有成功 (2认同)
  • 删除bindingRedirect为我解决了这个问题。单元测试没有通过与OP相同的错误,现在可以正常工作了。 (2认同)
  • 这是完整的代码线吗?以及具体需要在哪里添加?我所有其他的绑定重定向都包含在标签“dependentAssembly”中 (2认同)
  • 这效果很好。我想补充一点,如果您的解决方案中有多个项目,请确保评估所有项目并使用此方法进行解决。 (2认同)

Ogg*_*las 14

@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
Run Code Online (Sandbox Code Playgroud)

服务路径:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
Run Code Online (Sandbox Code Playgroud)

一些简单的设置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>
Run Code Online (Sandbox Code Playgroud)

如果您使用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>
Run Code Online (Sandbox Code Playgroud)

一个很好的关于这个问题的Github线程:

https://github.com/dotnet/corefx/issues/22781

  • github 线程的链接已失效。但以下线程似乎包含相关讨论:https://github.com/dotnet/runtime/issues/24382 (4认同)
  • 重定向到 4.0.0.0 是让我感到兴奋的原因。谢谢! (3认同)
  • 添加&lt;dependentAssembly&gt; &lt;assemblyIdentity name =“ System.Net.Http” .......从我这里工作。谢谢 (2认同)

Len*_*rri 9

我刚刚System.Net.Http使用 NuGet安装。你可以在这里抓住它:

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

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

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

无法加载文件或程序集“System.Net.Http, Version=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">
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*ski 5

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

Update-Package -reinstall

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