[Перевод] 9 секретов ASP.NET Core
Совсем недавно мы обновили ASP.NET Core до версии 2.1. Один из создателей платформы, наш коллега Дэвид Фоулер поделился некоторыми её полезными особенностями, о которых мало кто знает. Кроме того, помимо 9 секретных фич ASP.NET Core, под катом вы найдете и список основных нововведений со всеми полезными ссылками. Присоединяйтесь!
Вышла версия 2.1 открытой платформы ASP.NET Core, и разработчик Дэвид Фоулер (David Fowler) поделился в «Твиттере» ее некоторыми полезными особенностями, о которых мало кто знает. Безусловно, теперь платформа работает быстрее, но также появился ряд новых возможностей и передовых методов, которые стоит рассмотреть подробнее.
ASP.NET Core теперь работает с новой хостинговой моделью. Приложения .NET формируют и запускают хост.
Хост отвечает за запуск приложений и управление их жизненным циклом. Задача узла Generic Host состоит в том, чтобы отделить конвейерную обработку HTTP от API веб-хоста для того, чтобы иметь возможность создавать на хосте больше сценариев. Отправка сообщений, фоновые и другие задачи, не относящиеся к HTTP, работают лучше благодаря сквозным функциям Generic Host, таким как конфигурирование, внедрение зависимостей (DI) и логирование.
Это означает, что теперь для сценариев без веб-хостинга есть не только WebHost, но и Generic Host. При этом работа будет такой же удобной, как и с ASP.NET Core, но еще у вас появятся новые возможности, такие как DI, логирование и конфигурирование. Пример кода для Generic Host можно найти на GitHub.
С его помощью можно запускать длинные фоновые операции как в универсальном хосте, так и в ваших веб-приложениях. В ASP.NET Core 2.1 появилась поддержка базового класса BackgroundService, который значительно облегчает создание длинного асинхронного цикла. Пример кода для Hosted Service также находится на GitHub.
Создавать простую временную фоновую задачу:
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;
}
легко!
Теперь можно размещать ASP.NET Core внутри службы Windows! Многие пользователи просили добавить данную функцию. IIS вам больше не нужен, чтобы размещать все, что пожелаете. Взгляните на Microsoft.AspNetCore.Hosting.WindowsServices на NuGet и подробную документацию по размещению собственного приложения 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()
.Build();
host.RunAsService();
}
IHOSTINGSTARTUP — конфигурация IWEBHOSTBUILDER с атрибутом сборки
Как всегда, простая и точная реализация с использованием источника на GitHub.
[assembly: HostingStartup(typeof(SampleStartups.StartupInjection))]
Это будет вам интересно, обязательно обратите на них внимание. Можно создавать пакеты, которые используются в качестве вспомогательных средств для исходного кода, распространяемого через shared source. Между собой мы называем их «пакеты shared source». Они используются в ASP.NET Core повсюду, когда к чему-то необходимо предоставить общий доступ, но при этом оно не должно быть общедоступно через API. Тогда ваш код будет использоваться, но не будет появляться зависимостей от конечного пакета.
Они используются в CSPROJ таким образом. Обратите внимание на атрибут PrivateAssets:
Если вам необходимо задействовать метод в типе через отражение, и этот метод может быть асинхронным, то вам поможет оптимизированная и гибкая функция ObjectMethodExecutor, которую мы используем повсеместно в кодовой базе ASP.NET Core.
Команда использует этот код в MVC, чтобы задействовать ваши методы контроллера. Они используют этот код в SignalR для задействования методов хаба. Она работает с синхронными и асинхронными методами. Она также может работать с пользовательскими ожидаемыми объектами и асинхронными рабочими процессами F#.
Небольшой и часто запрашиваемый метод. Если вам не нравится то, что выдается после запуска драйвера dotnet, когда вы размещаете веб-приложение (распечатываете информацию привязки), то вы можете использовать новый метод расширения SuppressStatusMessages.
WebHost.CreateDefaultBuilder(args)
.SuppressStatusMessages(true)
.UseStartup();
В версии 2.1 стало проще настраивать параметры, для работы которых требуются сервисы. Раньше приходилось создавать тип, полученный с помощью IConfigureOptions, теперь можно сделать все это в ConfigureServices с помощью AddOptions ‹TOptions›
public void ConfigureServicdes(IServiceCollection services)
{
services.AddOptions()
.Configure((o,env) =>
{
o.Path = env.WebRootPath;
});
}
Обычно нет необходимости настраивать IHttpContext, но многие хотят знать, как это сделать, а некоторые считают, что это должно осуществляться автоматически. Он не регистрируется по умолчанию, так как его наличие приводит к снижению производительности. Однако в ASP.NET Core 2.1 был добавлен PR для метода расширения, что облегчит процесс, если вы этого захотите.
services.AddHttpContextAccessor ();
Итак, ASP.NET Core 2.1 готова к выпуску.
Новые функции в этой версии:
Посмотрите список изменений в ASP.NET Core 2.1 в документах ASP.NET Core, чтобы узнать больше об этих функциях. Полный список всех изменений в новой версии представлен в примечаниях к выпуску.
Попробуйте! Пройдите курс QuickStart — и вы сможете создавать базовые веб-приложения за 10 минут.