- PVSM.RU - https://www.pvsm.ru -

9 секретов ASP.NET Core

Совсем недавно мы обновили ASP.NET Core до версии 2.1. Один из создателей платформы, наш коллега Дэвид Фоулер поделился некоторыми её полезными особенностями, о которых мало кто знает. Кроме того, помимо 9 секретных фич ASP.NET Core, под катом вы найдете и список основных нововведений со всеми полезными ссылками. Присоединяйтесь!

9 секретов ASP.NET Core - 1

Вышла версия 2.1 открытой платформы ASP.NET Core, и разработчик Дэвид Фоулер (David Fowler) поделился в «Твиттере» [1] ее некоторыми полезными особенностями, о которых мало кто знает. Безусловно, теперь платформа работает быстрее, но также появился ряд новых возможностей и передовых методов, которые стоит рассмотреть подробнее.

Универсальный узел .NET generic host [2]

ASP.NET Core теперь работает с новой хостинговой моделью. Приложения .NET формируют и запускают хост [3].

Хост отвечает за запуск приложений и управление их жизненным циклом. Задача узла Generic Host состоит в том, чтобы отделить конвейерную обработку HTTP от API веб-хоста для того, чтобы иметь возможность создавать на хосте больше сценариев. Отправка сообщений, фоновые и другие задачи, не относящиеся к HTTP, работают лучше благодаря сквозным функциям Generic Host, таким как конфигурирование, внедрение зависимостей (DI) и логирование.

Это означает, что теперь для сценариев без веб-хостинга есть не только WebHost, но и Generic Host. При этом работа будет такой же удобной, как и с ASP.NET Core, но еще у вас появятся новые возможности, такие как DI, логирование и конфигурирование. Пример кода для Generic Host можно найти на GitHub [4].

Интерфейс IHOSTEDSERVICE [5]

С его помощью можно запускать длинные фоновые операции как в универсальном хосте, так и в ваших веб-приложениях. В ASP.NET Core 2.1 появилась поддержка [6] базового класса BackgroundService, который значительно облегчает создание длинного асинхронного цикла. Пример кода для Hosted Service также находится на GitHub [7].

Создавать [8] простую временную фоновую задачу:

public Task StartAsync(CancellationToken cancellationToken)
{
   _logger.LogInformation("Timed Background Service is starting.");
 
   _timer = new Timer(DoWork, null, TimeSpan.Zero, 
        TimeSpan.FromSeconds(5));
 
   return Task.CompletedTask;
}

легко!

Службы windows на .NET Core [9]

Теперь можно размещать ASP.NET Core внутри службы Windows! Многие пользователи просили добавить данную функцию. IIS вам больше не нужен, чтобы размещать все, что пожелаете. Взгляните на Microsoft.AspNetCore.Hosting.WindowsServices [10] на NuGet и подробную документацию [3] по размещению собственного приложения ASP.NET Core в Windows в качестве службы Windows без IIS.

public static void Main(string[] args)
{
    var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
    var pathToContentRoot = Path.GetDirectoryName(pathToExe);
 
    var host = WebHost.CreateDefaultBuilder(args)
        .UseContentRoot(pathToContentRoot)
        .UseStartup<Startup>()
        .Build();
 
    host.RunAsService();
}

IHOSTINGSTARTUP [11] — конфигурация IWEBHOSTBUILDER с атрибутом сборки

Как всегда, простая и точная реализация с использованием источника на GitHub.

[assembly: HostingStartup(typeof(SampleStartups.StartupInjection))]

Пакеты SHARED SOURCE [1]

Это будет вам интересно, обязательно обратите на них внимание. Можно создавать пакеты, которые используются в качестве вспомогательных средств для исходного кода, распространяемого через shared source. Между собой мы называем их «пакеты shared source». Они используются в ASP.NET Core повсюду [12], когда к чему-то необходимо предоставить общий доступ, но при этом оно не должно быть общедоступно через API. Тогда ваш код будет использоваться, но не будет появляться зависимостей от конечного пакета.

Они используются в CSPROJ таким образом [13]. Обратите внимание на атрибут PrivateAssets [14]:

<PackageReference Include="Microsoft.Extensions.ClosedGenericMatcher.Sources" PrivateAssets="All" Version="" />
<PackageReference Include="Microsoft.Extensions.ObjectMethodExecutor.Sources" PrivateAssets="All" Version="" />

OBJECTMETHODEXECUTOR [15]

Если вам необходимо задействовать метод в типе через отражение, и этот метод может быть асинхронным, то вам поможет оптимизированная и гибкая функция ObjectMethodExecutor [16], которую мы используем повсеместно в кодовой базе ASP.NET Core.

Команда использует этот код в MVC, чтобы задействовать ваши методы контроллера. Они используют этот код в SignalR для задействования методов хаба. Она работает с синхронными и асинхронными методами. Она также может работать с пользовательскими ожидаемыми объектами и асинхронными рабочими процессами F#.

SUPPRESSSTATUSMESSAGES [17]

Небольшой и часто запрашиваемый метод. Если вам не нравится то, что выдается после запуска драйвера dotnet, когда вы размещаете веб-приложение (распечатываете информацию привязки), то вы можете использовать новый метод расширения SuppressStatusMessages.

WebHost.CreateDefaultBuilder(args)
    .SuppressStatusMessages(true)
    .UseStartup<Startup>();

ADDOPTIONS [18]

В версии 2.1 стало проще настраивать параметры, для работы которых требуются сервисы. Раньше приходилось создавать тип, полученный с помощью IConfigureOptions , теперь можно сделать все это в ConfigureServices с помощью AddOptions ‹TOptions›

public void ConfigureServicdes(IServiceCollection services)
{
    services.AddOptions<MyOptions>()
        .Configure<IHostingEnvironment>((o,env) =>
        {
            o.Path = env.WebRootPath;
        });
}    

IHTTPCONTEXT с ADDHTTPCONTEXTACCESSOR [19]

Обычно нет необходимости настраивать IHttpContext, но многие хотят знать, как это сделать [20], а некоторые считают, что это должно осуществляться автоматически. Он не регистрируется по умолчанию, так как его наличие приводит к снижению производительности. Однако в ASP.NET Core 2.1 был добавлен PR [21] для метода расширения, что облегчит процесс [22], если вы этого захотите.

services.AddHttpContextAccessor ();

Итак, ASP.NET Core 2.1 готова к выпуску [23].

Новые функции в этой версии:

Посмотрите список изменений в ASP.NET Core 2.1 [36] в документах ASP.NET Core, чтобы узнать больше об этих функциях. Полный список всех изменений в новой версии представлен в примечаниях к выпуску [37].

Попробуйте! Пройдите курс QuickStart [38]— и вы сможете создавать базовые веб-приложения за 10 минут.

Автор: sahsAGU

Источник [39]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/285698

Ссылки в тексте:

[1] в «Твиттере»: https://twitter.com/davidfowl/status/1004232622845804544?s=12

[2] Универсальный узел .NET generic host: https://twitter.com/davidfowl/status/1004232943181561856

[3] запускают хост: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1&tabs=aspnetcore2x

[4] можно найти на GitHub: https://github.com/aspnet/Docs/tree/master/aspnetcore/fundamentals/host/generic-host

[5] Интерфейс IHOSTEDSERVICE: https://twitter.com/davidfowl/status/1004233301823852544

[6] появилась поддержка: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1

[7] находится на GitHub: https://github.com/aspnet/Docs/tree/master/aspnetcore/fundamentals/host/hosted-services/samples/

[8] Создавать: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1#timed-background-tasks

[9] Службы windows на .NET Core: https://twitter.com/davidfowl/status/1004233944085118976

[10] Microsoft.AspNetCore.Hosting.WindowsServices: https://www.nuget.org/packages/Microsoft.AspNetCore.Hosting.WindowsServices/

[11] IHOSTINGSTARTUP: https://twitter.com/davidfowl/status/1004235985150865408

[12] используются в ASP.NET Core повсюду: https://github.com/aspnet/Common/tree/ff87989d893b000aac1bfef0157c92be1f04f714/shared

[13] таким образом: https://github.com/aspnet/SignalR/blob/3d0f68b22c05b918c4e2637af0d879e34c0b48a2/src/Microsoft.AspNetCore.SignalR.Core/Microsoft.AspNetCore.SignalR.Core.csproj#L18-L19

[14] PrivateAssets: https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#controlling-dependency-assets

[15] OBJECTMETHODEXECUTOR: https://twitter.com/davidfowl/status/1004237863913906176

[16] ObjectMethodExecutor: https://github.com/aspnet/Common/blob/ff87989d893b000aac1bfef0157c92be1f04f714/shared/Microsoft.Extensions.ObjectMethodExecutor.Sources/ObjectMethodExecutor.cs

[17] SUPPRESSSTATUSMESSAGES: https://twitter.com/davidfowl/status/1004239734384701440

[18] ADDOPTIONS: https://twitter.com/davidfowl/status/1004248179628392448

[19] IHTTPCONTEXT с ADDHTTPCONTEXTACCESSOR: https://twitter.com/davidfowl/status/1004259627012255745

[20] как это сделать: https://github.com/aspnet/Hosting/issues/793

[21] был добавлен PR: https://github.com/aspnet/HttpAbstractions/pull/947

[22] облегчит процесс: https://github.com/aspnet/HttpAbstractions/pull/947/commits/916065e0ae8e04a8f5e7631d97480a0d612a42af

[23] готова к выпуску: https://blogs.msdn.microsoft.com/webdev/2018/05/30/asp-net-core-2-1-0-now-available/

[24] SignalR: https://docs.microsoft.com/en-us/aspnet/core/signalr/?view=aspnetcore-2.1

[25] Библиотеки класса Razor: https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/ui-class?view=aspnetcore-2.1

[26] Библиотека идентификаторов пользовательских интерфейсов и автоматическая кодогенерация: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.1

[27] HTTPS : https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-2.1

[28] Добавление шаблонов для обеспечения соответствия некоторым требованиям общего положения о защите данных: https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.1

[29] Функциональная тестовая инфраструктура MVC: https://docs.microsoft.com/en-us/aspnet/core/testing/integration-testing?view=aspnetcore-2.1

[30] [ApiController]: https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#annotate-class-with-apicontrollerattribute

[31] ActionResult<Т>: https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-2.1#actionresultt-type

[32] IHttpClientFactory: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1

[33] Kestrel в Sockets: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

[34] Унифицированный хостинг-строитель: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1

[35] Обновленные шаблоны SPA: https://docs.microsoft.com/en-us/aspnet/core/spa/?view=aspnetcore-2.1

[36] список изменений в ASP.NET Core 2.1: https://docs.microsoft.com/en-us/aspnet/core/aspnetcore-2.1

[37] примечаниях к выпуску: https://github.com/aspnet/Home/releases/tag/2.1.0

[38] курс QuickStart : https://www.microsoft.com/net/learn/apps/web/get-started

[39] Источник: https://habr.com/post/416443/?utm_campaign=416443