在 .NET Core 2.1.0-rc1-final 中使用 System.Net.Http.SocketsHttpHandler

Posted

技术标签:

【中文标题】在 .NET Core 2.1.0-rc1-final 中使用 System.Net.Http.SocketsHttpHandler【英文标题】:Using System.Net.Http.SocketsHttpHandler in .NET Core 2.1.0-rc1-final 【发布时间】:2018-05-22 06:10:05 【问题描述】:

.NET Core 2.1 在System.Net.HttpClient 上带有一个很棒的improvement

对于 HttpClient,我们从头开始构建了一个新的托管 HttpClientHandler 称为SocketHttpHandler。正如你可能猜到的, 它是基于 .NET 套接字的 HttpClient 的 C# 实现和 跨度。

我的应用程序是作为 Windows 服务托管的 ASP.NET Core 应用程序,根据 Microsoft this doc,该项目基于 .NET Core,但其 TargetFramework 是 .NET 框架。

该应用程序适用于面向 .NET Framework 4.7.1 的 .NET Core 2.0。

最近微软发布了 Microsoft.AspNetCore 2.1.0-rc1-final,它可以用于生产。所以我尝试升级到这个版本。

所以我将TargetFramework 升级到 4.7.2 并将参考升级如下。

<PackageReference Include="Microsoft.AspNetCore" Version="2.1.0-rc1-final" /> <PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="2.1.0-rc1-final" /> <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.1.0-rc1-final" /> <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.1.0-rc1-final" /> <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.1.0-rc1-final" /> <PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.1.0-rc1-final" />

然后它停止工作并且编译器引发错误,例如 找不到类型或命名空间名称“HttpClient”

我知道HttpClient 存在于NuGet System.Net.Http 程序集中。

但是它的最新版本是 8 个月前的 4.3.3,在我看来它不包含 SocketHttpHandler 的实现。

所以我的问题是:如何使用 .NET Core 2.1 中针对 .NET framework 4.7.2 的最新 HttpClient?

【问题讨论】:

.NET Core 与 ASP.NET Core 不同。 .NET Core 是底层运行时。 ASP.NET Core 是一个可以在 .NET Core 或完整的 .NET Framework 之上运行的框架。正如您所提到的,您的应用程序针对的是完整框架的 4.7.2 版本,而不是 .NET Core 2.0 或 2.1 如果你想使用它,你必须切换到 .NET Core 2.1 并且不再以 .NET Framework 4.7.x 为目标。您仍然可以在 Windows 上运行它并使用大部分 API,甚至包括带有 Windows 兼容包的注册表之类的东西。当然,它会将您限制在 Windows 作为托管平台,但您会从 .NET Core 的改进中受益 @PanagiotisKanavos,请查看我的问题中链接的 MS 文档,在 Windows 服务中托管 ASP.NET Core 时,目标框架必须设置为 .NET Framework。当我使用 .NET Core 2.0 时,它适用于 .NET 4.7.1 @Tseng,我正在关注微软的 doc,它清楚地解释了 targetFramework 必须是我的 ASP.NET Core 应用程序的 .NET 框架。 @Mr.WangfromNextDoor 该文档与运行时.NET Core 无关。我已经在控制台应用程序中的 .NET Core 2.1 RC 上使用了 SocketHttpHandler。无论您是否使用 ASP.NET Core 堆栈,您都无法在 .NET Framework 4.7 上使用它。它不是 ASP.NET Core 堆栈的一部分。它是 .NET Core BCL 的一部分,您没有在该运行时上运行。如果要使用 SocketHttpHandler,则必须使用 ASP.NET Core 模板创建一个新的 .NET Core 2.1 项目 【参考方案1】:

.NET Core 与 ASP.NET Core 不同。 .NET Core 是底层运行时。 ASP.NET Core 是一个可以在 .NET Core 或完整的 .NET Framework 运行时之上运行的框架。正如您所提到的,您的应用程序针对的是完整框架的 4.7.1 版本,而不是 .NET Core 2.0 或 2.1

新的 HttpClient 和 SocketsHttpHandler 是 .NET Core 2.1 的一部分。它们包含在 System.NET.Http 程序集中。您可以在任何以该运行时为目标的应用程序中使用它们,甚至是桌面应用程序。我已经这样做了,没有对 ASP.NET Core 程序集或包的任何引用。我添加的只是对 System.Net.Http 的引用。

我的csproj

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="System.Net.Http">
      <HintPath>C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.1.0-rc1\ref\netcoreapp2.1\System.Net.Http.dll</HintPath>
    </Reference>
  </ItemGroup>

</Project>

还有一个示例调用:

using System;
using System.Net.Http;
using System.Net;
using System.Threading.Tasks;

class Program

    static async Task Main(string[] args)
    
        var handler = new SocketsHttpHandler
        
            MaxConnectionsPerServer=100,
            AutomaticDecompression=DecompressionMethods.GZip|DecompressionMethods.Deflate
        ;
        var client = new HttpClient(handler);
        var result = await client.GetStringAsync(someUrl);
        Console.WriteLine("Hello World!");
    

您的项目必须针对特定的运行时,如果您想使用它们,甚至不是 2.0。您还需要安装 .NET Core 2.1 RC 1 SDK 来创建和构建面向 .NET Core 2.1 的项目。您还必须将新的运行时安装到生产服务器。

完成此操作后,您可以使用dotnet new 和模板名称从命令行创建一个 .NET Core 项目,例如:

dotnet new razor
dotnet new mvc
dotnet new angular

或通过 Visual Studio,从 Visual C# &gt; .NET Core 类别中选择 ASP.NET Core Web Application 模板。

如果您选择.NET Core 作为运行时并选择ASP.NET Core 2.1 作为目标,您也可以从Web &gt; ASP.NET Core Web Application 模板创建它。

如果您以 .NET Core 2.1 为目标,则此类可用。如果我将目标更改为netcoreapp2.0,编译器会抱怨 SocketsHttpHandler 不存在。

目前除了几篇博文和the source code itself之外,没有关于 SocketsHttpHandler 的文档

【讨论】:

所以没有希望看到 SocketsHttpHandler 进入 .NET 框架,对吧?

以上是关于在 .NET Core 2.1.0-rc1-final 中使用 System.Net.Http.SocketsHttpHandler的主要内容,如果未能解决你的问题,请参考以下文章

.net core 3.0和.net5有什么区别

ASP.NET Core (.NET Core) and ASP.NET Core (.NET Framework)区别

细说.net core Startup

net core 在startup以外的地方怎么取到iservicecollection

Asp.Net core (Full .Net framework) vs Asp.Net core (.Net Core) 性能

如果 .Net Core 可以在 Windows 上运行,为啥不能在 .Net Framework 中引用 .Net Core DLL?