代码之家  ›  专栏  ›  技术社区  ›  Mr.Wang from Next Door

在.NET Core 2.1.0-rc1-final中使用system.net.http.socketshttphandler

  •  3
  • Mr.Wang from Next Door  · 技术社区  · 6 年前

    .NET Core 2.1提供了 improvement System.Net.HttpClient

    对于httpclient,我们从一开始就建立了一个新的管理 调用了HttpClientHandler SocketHttpHandler . 你可能会猜到, 它是基于.NET套接字和 跨度。

    我的应用程序是作为Windows服务托管的ASP.NET核心应用程序, 根据微软 this Doc,该项目是基于.NET核心的,但是 TargetFramework 是.NET框架。

    该应用程序与面向.NET Framework 4.7.1的.NET Core2.0配合得很好。

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

    所以我升级了 目标框架 至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,在我看来,它不包含 socketthttphandler公司 .

    所以我的问题是:我如何使用.NET核心2.1中针对.NET框架4.7.2的最新httpclient?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Panagiotis Kanavos    6 年前

    .NET核心与ASP.NET核心不同。.NET核心是基础运行时。ASP.NET核心是一个可以在.NET核心或整个.NET框架运行时上运行的框架。正如您所提到的,您的应用程序目标是完整框架的4.7.1版本,而不是.NET核心2.0或2.1版本。

    新的httpclient和 SocketsHttpHandler 是.NET核心的一部分 二点一 . 它们包含在system.net.http程序集中。您可以在任何针对运行时的应用程序中使用它们,甚至桌面应用程序。我已经这样做了,没有任何对ASP.NET核心程序集或包的引用。我只添加了一个对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核心2.1的项目。您还必须将新的运行时安装到生产服务器上。

    完成后,可以使用命令行创建.NET核心项目 dotnet new 以及模板的名称,例如:

    dotnet new razor
    dotnet new mvc
    dotnet new angular
    

    或者通过Visual Studio,从 Visual C# > .NET Core 分类并选择 ASP.NET Core Web Application 模板。

    您也可以从 Web > ASP.NET Core Web Application 您选择的模板 .NET Core 作为运行时和 ASP.NET Core 2.1 作为目标。

    这个班是 只有 如果以.NET核心为目标,则可用 二点一 . 如果我把目标改成 netcoreapp2.0 编译器会抱怨socketshttphandler不存在。

    目前,除了一些博客文章和 the source code itself