Хост веб-приложения .net core 6.0 в качестве службы Windows Kestrel

  • Михаил
  • 8 мин. на прочтение
  • 150
  • 21 Feb 2024
  • 23 May 2024

Если вы создадите веб-приложение .NET Core 6.0 по умолчанию, оно будет работать как служба приложений. Но если вы хотите разместить приложение самостоятельно, вы можете запустить его как службу Windows.

Вот как вы обычно инициализируете веб-приложение в .NET Core 6:

var builder = WebApplication.CreateBuilder(args);

Для реализации возможностей службы Windows вам понадобится следующий пакет Nuget:

Microsoft.Extensions.Hosting.WindowsServices

Install-Package Microsoft.Extensions.Hosting.WindowsServices

И вам нужно изменить WebApplication.CreateBuilder:

var options = new WebApplicationOptions
{
    Args = args,
    ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default
};

var builder = WebApplication.CreateBuilder(options);
var configuration = builder.Configuration;

builder.Host.UseWindowsService();

builder.WebHost.ConfigureKestrel(options =>
{
    // http port
    options.ListenAnyIP(configuration.GetSection("Host:HttpPort").Get());

         // https port
    options.ListenAnyIP(configuration.GetSection("Host:HttpsPort").Get(), listenOptions => listenOptions.UseHttps());
});

Службы Windows расположены в папке System32, поэтому WebApplicationOptions изменяет корневой путь содержимого обратно на базовый каталог самого приложения.

Развертывание

set serviceName="NLT"
set serviceFilePath="C:\Program Files\TitratorNLT\Windows\TitratorNLT.exe"
set serviceDescription = "Служба выгрузки в LIMS приборов серии NLT"

sc create %serviceName%  BinPath=%serviceFilePath%
sc config %serviceName% start=auto  
sc config %serviceName% start=delayed-auto   
sc description %serviceName% %serviceDescription%
sc failure %serviceName% reset=0 actions=restart/1200000
sc start  %serviceName%
pause

Удаление

set serviceName="NLT"
sc stop   %serviceName% 
sc delete %serviceName% 
pause