【问题标题】:'HttpClientHandler' does not contain a definition for 'ClientCertificates' in net461 and net47?'HttpClientHandler' 不包含 net461 和 net47 中的 'ClientCertificates' 的定义?
【发布时间】:2019-06-11 13:51:42
【问题描述】:

我正在制作一个 NuGet 包,我的 csproj 看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup Label="Globals">
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netstandard1.6;net461;net47</TargetFrameworks>
    ...
    <PackageId>Package2</PackageId>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Package1\Package1.csproj" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='net461' OR '$(TargetFramework)'=='net47'">
    <Reference Include="System.Net.Http" />
  </ItemGroup>

</Project>

它引用的项目如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup Label="Globals">
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netstandard1.6;net461;net47</TargetFrameworks>
    <PackageId>Package1</PackageId>
    ...
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
    <NoWarn>1701;1702; CS1591</NoWarn>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard1.6' OR '$(TargetFramework)'=='net461'">
      <PackageReference Include="System.ValueTuple" Version="4.5.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='net461' OR '$(TargetFramework)'=='net47'">
    <Reference Include="System.Net.Http" />
  </ItemGroup>

</Project>

Package2 项目中,它具有以下行:

webRequestHandler.ClientCertificates.Add(certificate);

但它不是在 net461net47 中构建的,说:

'HttpClientHandler' does not contain a definition for 
'ClientCertificates' and no accessible extension method 
'ClientCertificates' accepting a first argument of type
'HttpClientHandler' could be found (are you missing a using
 directive or an assembly reference?) 

Package2(net461),
Package2(net47)

但我唯一改变的是从包 2 的 csproj 中删除:

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard1.6' OR '$(TargetFramework)'=='net461' OR '$(TargetFramework)'=='net47'">
    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="1.1.2" />
  </ItemGroup>

谁能帮助我了解如何解决它?我真的不想引入整个 NuGet 包来修复这个依赖项,我想我只是缺少一个程序集,但据我所知,它应该在 System.Net.Http 中,我应该已经在引用它(所以应该是它已经依赖的其他项目)。

【问题讨论】:

    标签: c# .net dependencies multitargeting


    【解决方案1】:

    看起来这个属性从版本 4.7.1 开始可用:

    https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.clientcertificates?view=netframework-4.7.1

    请注意,如果您选择较旧的 .NET 版本,您将看到如下消息:

    The requested page is not available for .NET Framework 4.7.
    

    【讨论】:

      【解决方案2】:

      对我来说,解决方案是下载最新版本的“System.Net.Http”。 您可以通过 NuGet 包管理器找到它。

      在撰写本文时,v4.3.4 是最新版本,它包含 ClientCertificates 方法。

      【讨论】:

      • 是的,我最终也是这样做的
      【解决方案3】:

      我已经换掉了 NuGet 包的程序集引用:

        <ItemGroup Condition="'$(TargetFramework)'=='net47' OR '$(TargetFramework)'=='net461'">
          <PackageReference Include="System.Net.Http" Version="4.3.4" />
        </ItemGroup>
      

      很确定这是 错误的做法™,因为 .NET Framework 中的程序集引用应该足够了,我可能会在安装包的任何地方遇到许多冲突的引用问题,但是这是我现在能想到的最好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        • 2018-01-27
        相关资源
        最近更新 更多