Использование System.Net.Http.SocketsHttpHandler в .NET Core 2.1.0-rc1-final

.NET Core 2.1 поставляется с отличным улучшение System.Net.HttpClient

Для HttpClient мы создали новый управляемый HttpClientHandler с нуля под названием SocketHttpHandler. Как вы, наверное, догадались, это реализация HttpClient на C # на основе сокетов .NET и Span.

Мое приложение - это приложение ASP.NET Core, размещенное как служба Windows, согласно Microsoft this doc, проект основан на .NET Core, но его TargetFramework - это .NET framework.

Приложение хорошо работает с .NET Core 2.0, нацеленным на .NET framework 4.7.1.

Недавно Microsoft выпустила 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.

Однако его последняя версия - 4.3.3 от 8 месяцев назад, которая, как мне кажется, не содержит реализации SocketHttpHandler.

Итак, мой вопрос: как я могу использовать последнюю версию HttpClient из .NET Core 2.1, ориентированную на .NET framework 4.7.2?


person Mr.Wang from Next Door    schedule 22.05.2018    source источник
comment
.NET Core - это не то же самое, что ASP.NET Core. .NET Core - это базовая среда выполнения. ASP.NET Core - это платформа, которая может работать поверх .NET Core или полной .NET Framework. Как вы упомянули, ваше приложение нацелено на версию 4.7.2 полной платформы, а не на .NET Core 2.0 или 2.1.   -  person Panagiotis Kanavos    schedule 22.05.2018
comment
Если вы хотите использовать его, вам нужно перейти на .NET Core 2.1, а не на .NET Framework 4.7.x больше. Вы по-прежнему можете запускать его в Windows и использовать большую часть API, даже такие вещи, как реестр с Windows Compatibility Pack. Конечно, это ограничивает вас Windows в качестве платформы хостинга, но вы получаете выгоду от улучшений .NET Core.   -  person Tseng    schedule 22.05.2018
comment
@PanagiotisKanavos, пожалуйста, проверьте документ MS, связанный с моим вопросом, целевая платформа должна быть установлена ​​на .NET Framework при размещении ASP.NET Core в службах Windows. И он хорошо работает с таргетингом на .NET 4.7.1, когда я использую .NET Core 2.0.   -  person Mr.Wang from Next Door    schedule 23.05.2018
comment
@Tseng, я слежу за Microsoft doc, в котором четко объясняется, что targetFramework должен быть платформой .NET для моего приложения ASP.NET Core.   -  person Mr.Wang from Next Door    schedule 23.05.2018
comment
@ Mr.WangfromNextDoor этот документ не о .NET Core, среде выполнения. Я уже использую SocketHttpHandler на .NET Core 2.1 RC в консольных приложениях. Вы вообще не можете использовать его в .NET Framework 4.7, независимо от того, используете ли вы стек ASP.NET Core или нет. Это не часть стека ASP.NET Core. Это часть BCL .NET Core, и вы не работаете в этой среде выполнения. Если вы хотите использовать SocketHttpHandler, вам нужно будет создать новый проект .NET Core 2.1 с шаблоном ASP.NET Core.   -  person Panagiotis Kanavos    schedule 23.05.2018
comment
@ Mr.WangfromNextDoor в любом случае, вам не нужно настраивать таргетинг на всю структуру для создания веб-приложения ASP.NET Core, на самом деле это наименее популярный вариант. Если вам нужно настроить таргетинг на всю структуру по другим причинам, например, потому что вы используете библиотеку, которая не может работать в .NET Core, вы не сможете использовать SocketsHttpHandler.   -  person Panagiotis Kanavos    schedule 23.05.2018


Ответы (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.

My 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. Вам также необходимо установить новую среду выполнения на производственные серверы.

После этого вы можете создать проект .NET Core из командной строки с 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 Core 2.1. Если я изменю цель на netcoreapp2.0, компилятор будет жаловаться на то, что SocketsHttpHandler не существует.

Прямо сейчас нет документации по SocketsHttpHandler, кроме пары сообщений в блоге и сам исходный код

person Panagiotis Kanavos    schedule 23.05.2018
comment
Так что нет никакой надежды увидеть SocketsHttpHandler в .NET framework, верно? - person Mr.Wang from Next Door; 23.05.2018