net461和net47中的“ HttpClientHandler”不包含“ ClientCertificates”的定义?

时间:2019-01-17 11:10:32

标签: c# .net dependencies multitargeting

我正在制作一个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)

但是我唯一改变的是将其从package2的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中,我应该已经引用了(并且它已经依赖的另一个项目也应该如此。

3 个答案:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

请确保这是错误的事情™,因为.NET Framework中的程序集引用应该足够了,在我安装软件包的任何地方,我可能都会遇到许多相互矛盾的引用问题,但是这是我现在能想到的最好的方法。