139

我有一个奇怪的问题,让我发疯……</p>

我有一个简单的类库项目(完整的 .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”或其依赖项之一。该系统找不到指定的文件。
Source= 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, 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 服务的 app.config(它正在使用类库):

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

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

4

22 回答 22

158

您面临的问题与 Visual Studio 有关,尤其是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 完成的
  • 构建时错误:c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\更改 VS 2017 ( )附带的 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

于 2018-02-19T09:11:54.210 回答
115

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

<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
于 2017-11-30T15:41:32.443 回答
21

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

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

无法加载文件或程序集 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。系统找不到指定的文件。","ExceptionType":"System.IO.FileNotFoundException","StackTrace":" 在 Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\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(关闭)\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型控制器类型)"}} 或其依赖项之一。系统找不到指定的文件。","ExceptionType":"System.IO.FileNotFoundException","StackTrace":" 在 Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\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(关闭)\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型控制器类型)"}} 或其依赖项之一。系统找不到指定的文件。","ExceptionType":"System.IO.FileNotFoundException","StackTrace":" 在 Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\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(关闭)\r\n 在 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可以解决问题,但并非在所有情况下都可以。

在此处输入图像描述

为了在您的本地计算机上重现错误,只需System.Net.Http.dll从 Visual Studio 特定文件夹中删除所需的。这会给你运行时错误,可能还有一些构建错误。在这些被修复之后,一切都应该工作,至少它对我有用。

如果您已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>
</Reference>

如果您使用像 Jenkins、TeamCity 或 AppVeyor 这样的构建服务器,那么缺少的运行时.dll也可能存在。.dll在这种情况下,使用 System.Net.Http 的 NuGet 版本或在本地删除缺失的内容可能无济于事。要解决此错误,请查看未找到的版本和具体的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

于 2018-11-05T22:29:43.973 回答
10

我刚刚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, 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">

<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 网站终于启动,没有出现任何错误。

于 2019-06-26T01:00:16.107 回答
5

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

Update-Package -reinstall

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

于 2019-01-24T03:11:59.893 回答
2

I believe part of the answer can be found in Microsoft's documentation.

When you create a desktop app in Visual Studio that targets the .NET Framework 4.5.1 or a later version, the app uses automatic binding redirection.

As @Vivek Sharma's answer points out, removing:

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

resolved the problem in 3 such cases in my app. When you examine the DLL with Powershell, for example:

 ([system.reflection.assembly]::loadfile("C:\MyApp\bin\System.Net.Sockets.dll")).FullName

Outputs

System.Net.Sockets, Version=4.0.0.0

Clearly a binding redirect to 4.2.0.0 isn't going to work because we are outputting 4.0.0.0 to the bin.

It's also worth checking the GAC to see if the assembly is also missing from there:

 gacutil -l System.Net.Sockets

In my case the particular version was also missing from the GAC. If the DLL were in the GAC then it should have been found in the assembly binding process.

于 2020-02-26T20:48:25.607 回答
2

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 的程序集重定向

于 2020-02-18T15:11:06.243 回答
2

当我将 Web 服务部署到我们的一台服务器时,我遇到了这个错误。该项目针对未安装在服务器上的 .Net 框架 4.7.2。在服务器上安装 4.7.2 框架更正了该问题。

于 2018-12-10T12:53:11.103 回答
1

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

于 2019-06-04T18:06:26.847 回答
1

我尝试了各种解决方案(删除dependentAssembly 或指定绑定重定向)。他们都没有工作。

但是,唯一对我有用的解决方案是从 Visual Studio 将 System.Net.Http (或任何给您版本问题的 DLL)的特定版本显式设置为 False。

在此处输入图像描述

于 2020-10-27T11:43:24.647 回答
1

我有一个类似的问题。尝试删除 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

随着所有这些引用的更改并且没有绑定重定向构建和运行的项目。

于 2021-02-26T16:00:34.480 回答
1

我遇到了类似的问题,并遇到了很多困难解决了它。我正在使用 Visual Studio 2019

  1. 删除对 System.Net.* 的任何程序集引用(任何以 System.Net 开头的包)
  2. 卸载所有以 System.Net.* 开头的包
  3. Microsoft.AspNet.WebApi.Client从包管理器安装
  4. 以上应该可以解决您的问题。无论如何,您仍然有问题。Intellisense 会建议您添加参考System.Net.Http,点击添加参考。
  5. 就我而言,它建议两个参考System.Net.HttpSystem.Net.Http.Formatting. 单击添加后,它工作正常。
于 2021-02-24T11:05:33.733 回答
1

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

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

于 2019-02-21T16:16:51.910 回答
1

除了上面的许多建议外,这对我有用:

  1. 删除 Nuget 包 4.3.4(我不得不降级另一个需要它的包)

  2. 添加System.Net.Http为参考(版本 4.2.0.0)

  3. 删除绑定重定向

  4. 添加System.Net.HttpWeb.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 中。至少我必须在我的代码中。

于 2020-09-09T22:47:33.350 回答
0

经过几天的努力,我终于为我的项目解决了 .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" />
于 2019-09-24T21:42:33.993 回答
0

一夜之间,我们的应用程序停止向我们的第三方提供商上传数据。我目前正在使用 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)
于 2020-09-25T01:12:54.727 回答
0

对我来说,这真的很奇怪。发现问题后需要数小时的调试。它并没有在本地发生,而是仅在使用 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未找到的异常。当删除代码以不接受HttpClient来自普通 .NET 项目的代码但func在库本身内部创建一个新代码时,它很高兴并且工作正常。希望这可能对其他人有所帮助,因为发生此错误的原因有很多:)

于 2019-03-04T15:57:10.983 回答
0

就我而言,我从文件的<runtime>标签下删除了所有依赖项及其绑定重定向。.config我构建了给我绑定错误的解决方案。单击错误,VS 仅根据需要填充依赖项及其重定向,并且能够在之后运行解决方案。

于 2021-12-16T18:00:04.970 回答
0

解决方案在多台开发机器上编译和运行良好,除了在运行项目时出现此错误的机器。删除所有文件并从 TFS 中检索它们没有帮助。

Visual Studio 修复解决了它。

从 Visual Studio 安装程序执行修复。

Visual Studio 2019 版本 16.11.5

于 2021-11-09T11:39:35.097 回答
0

我使用的是 .net 4。我的“System.Net.Http”引用指向 dll 的“.net 4.7”版本。所以我将 .dll 路径更改为指向“Microsoft.Net.Http”包并重建它。这解决了我的问题。

在此处输入图像描述

于 2021-03-25T16:38:45.857 回答
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)

我找到了一个 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] 替换为您自己的项目名称

希望对你有帮助,欢迎提问

于 2018-02-08T16:02:03.693 回答
-3

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

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

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

于 2019-07-10T23:28:45.517 回答