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

时间:2017-11-30 10:15:41

标签: .net visual-studio-2017 dotnet-httpclient 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);

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

  

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

     

内部异常1:FileNotFoundException:无法加载文件或   assembly' System.Net.Http,Version = 4.0.0.0,Culture = neutral,   公钥= b03f5f7f11d50a3a'或其中一个依赖项。该   系统找不到指定的文件。

我完全不知道为什么根本找不到System.Net.Http程序集 - 我的类库项目中甚至有一个程序集引用到.Net Framework程序集“System.Net.Http 4.0.0.0”

我还不明白的是,有这种奇怪的绑定重定向到4.2.0.0 - 哪一个来自? 为了解决这个问题,我尝试将以下重定向添加到Service Fabric Service的app.config(使用类库):

            

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

有人知道吗?有没有人见过这样的问题?

谢谢和问候, OliverB

20 个答案:

答案 0 :(得分:90)

您遇到的问题与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附带的System.Net.Http.dll扩展(或将其移动到其他地方......基本上摆脱它){{1} });如果你有不同的版本,那么路径会略有不同,但不是很多
  • 运行时错误:添加程序集绑定重定向

                

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

希望这有帮助。

<强>更新

在查找针对此问题的某些永久性修补程序以处理构建代理时,请注意,如果迁移到新的NuGet PackageReference模型(在c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\而不在.csproj中)往往会更好地工作。以下是有关如何进行此升级的指南的链接:https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference

答案 1 :(得分:36)

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

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

答案 2 :(得分:6)

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

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

  

{“ Message”:“发生错误。”,“ ExceptionMessage”:“错误   尝试创建类型为“ OrderController”的控制器时发生。   确保控制器具有无参数公共   构造函数。“,” ExceptionType“:” System.InvalidOperationException“,” StackTrace“:”   在   System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage   请求,HttpControllerDescriptor controllerDescriptor,类型   controllerType)\ 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,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(Closure)\ r \ n at   System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage   请求,HttpControllerDescriptor controllerDescriptor,类型   controllerType)“}}

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

Web项目:

enter image description here

服务项目:

enter image description here

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

查看path属性,我们可以看到Web项目针对.Net Framework程序集,而服务针对Visual Studio 2017中的程序集。由于服务器未安装Visual Studio 2017,因此将发生运行时错误。

Web路径:

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

答案 3 :(得分:2)

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

Update-Package -reinstall

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

答案 4 :(得分: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的程序集重定向

答案 5 :(得分:1)

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

答案 6 :(得分: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

所有这些引用都改变了,没有绑定重定向,项目构建和运行。

答案 7 :(得分:1)

我刚刚使用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,   文化=中性,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网站开始没有任何错误。

答案 8 :(得分: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" />

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

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

enter image description here

答案 11 :(得分:0)

我遇到了类似的问题,但解决了很多困难。我使用的是 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。点击添加后它工作正常。

答案 12 :(得分:0)

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

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

enter image description here

答案 13 :(得分: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)

答案 14 :(得分:0)

上面有很多建议,这对我有用:

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

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

  3. 删除bindingRedirect

  4. System.Net.Http添加到Web.config中的编译部分。

    <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中。至少我必须在代码中。

答案 15 :(得分:0)

我相信答案的一部分可以在微软的documentation中找到。

在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中,则应该为found in the assembly binding process

答案 16 :(得分:0)

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

答案 17 :(得分: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找不到异常。删除代码后,它们不接受常规.NET项目中的HttpClient,而是在库本身内部创建一个新的func,这很高兴且可以正常工作。 希望这可能对其他人有所帮助,因为发生此错误的原因有很多:)

答案 18 :(得分:0)

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

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

答案 19 :(得分: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]

希望这有帮助,随时问