Как запустить HostedService в приложении MVC Core без http-запроса

Вместо этого используйте Notepad ++. См. Мой персональный пост в блоге . Изнутри Notepad ++ выберите меню «Кодирование», затем «Кодировать в UTF-8 без спецификации».

6
задан adopilot 20 January 2019 в 22:25
поделиться

4 ответа

Если вы хотите, чтобы Служба выполняла фоновые задачи (аналогично старым Службам Windows), я предлагаю вам использовать: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/ host / generic-host? view = aspnetcore-2.2 вместо WebHost.

WebHost добавляет много вещей, которые, вероятно, вам не понадобятся, поскольку кажется простой фоновой работой (при условии, что вы читаете ваш код).

0
ответ дан gatsby 20 January 2019 в 22:25
поделиться

Фоновые службы запускаются при запуске приложения, а затем вам нужно синхронизироваться с ним.

Вы можете реализовать backhround сервис, используя класс BackgroundService из пространства имен Microsoft.Extensions.Hosting (Microsoft.Extensions.Hosting.Abstractions сборка):

Сначала объявляйте интерфейс вашего сервиса (в этом случае он пуст). Не красиво, но чисто):

public interface IMyService : IHostedService
{
}

Затем объявите свой сервис. Следующий фрагмент объявляет службу, которая запускается при запуске в течение 5 секунд, а затем выполняет задачу каждые две с половиной минуты:

internal sealed class MyService : BackgroundService, IMyService
{
    private const int InitialDelay = 5 * 1000;  //5 seconds;
    private const int Delay = (5 * 60 * 1000) / 2; // 2.5 minutes

    private readonly ILogger<MyService> m_Logger;

    public MyService(ILogger<MyService> logger, IServiceProvider serviceProvider)
    {
        if (logger == null)
            throw new ArgumentNullException(nameof(logger));
        if (serviceProvider == null)
            throw new ArgumentNullException(nameof(serviceProvider));

        this.m_Logger = logger;
        this.m_ServiceProvider = serviceProvider;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        try
        {
            m_Logger.LogDebug($"MyService is starting.");

            stoppingToken.Register(() => m_Logger.LogDebug($"MyService background task is stopping because cancelled."));

            if (!stoppingToken.IsCancellationRequested)
            {
                m_Logger.LogDebug($"MyService is waiting to be scheduled.");
                await Task.Delay(InitialDelay, stoppingToken);
            }

            m_Logger.LogDebug($"MyService is working.");

            while (!stoppingToken.IsCancellationRequested)
            {
                await DoSomethingAsync();

                await Task.Delay(Delay);
            }

            m_Logger.LogDebug($"MyService background task is stopping.");
        }
        catch (Exception ex)
        {
            m_Logger.LogDebug("MyService encountered a fatal error while w task is stopping: {Exception}.", ex.ToString());
        }
    }

    private async Task DoSomrthingAsync()
    {
         // do something here
         await Task.Delay(1000);
    }

}

Как видите, вы должны поддерживать фоновую службу «живой» ». Наконец, вы должны зарегистрировать его в своем Startup.cs в конце вашего метода ConfigureServices:

services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, MyService>();

Этого достаточно для запуска службы. имейте в виду, что ваше приложение может быть действительно запущено позднее, если оно размещено в IIS: ваше приложение (пере) запускается каждый раз, когда ваша сборка перерабатывается. Вместо этого, используя Kestrel, предоставляет единственное приложение, которое не будет переработано.

Для тех, кто использует .Net Core 2.1 или ниже, класс Background недоступен, но вы можете получить определение от github (я публикую то, что я использовал в прошлом, так как репозиторий github можно перемещать):

[ 113]
0
ответ дан Pier 20 January 2019 в 22:25
поделиться

Когда вы запускаете это с помощью Visual Studio, вы, скорее всего, используете IIS Express, который не будет запускать ваш проект ASP.NET Core до тех пор, пока не будет сделан первый запрос (на самом деле IIS работает по умолчанию). Это применимо при использовании хостинг-модели InProcess, которая впервые появилась в ASP.NET Core 2.2, и я ожидаю, что вы должны использовать ее, чтобы увидеть эту проблему. Смотрите этот выпуск GitHub для более подробной информации.

Вы можете доказать эту теорию, удалив XML-элемент AspNetCoreHostingModel из файла .csproj, который вы используете для размещения приложения ASP.NET Core (которое переключит его обратно в режим OutOfProcess). Похоже, что есть опция «Модель хостинга» в разделе «Отладка» в диалоговом окне свойств проекта VS2017, которую вы можете изменить на «Вне процесса», если вы не хотите редактировать .csproj напрямую.

Если вы хотите, чтобы хост-модель не использовалась только для рабочего сайта, вы можете использовать, например, преобразование Web.config. Если вы хотите, чтобы он был вне процесса как во время разработки, так и в производстве, достаточно просто изменить свойство, которое я назвал выше, поскольку оно автоматически преобразуется в свойство Web.config. Если вы предпочитаете использовать внутрипроцессную модель, хорошим вариантом будет включение предварительной загрузки в приложении IIS (см. здесь ).

0
ответ дан Kirk Larkin 20 January 2019 в 22:25
поделиться

Хостинговые службы запускаются при запуске хоста. В WebHost размещенные сервисы будут запущены сразу после запуска приложения . Это означает, что при правильной реализации ваша размещенная служба будет работать без запроса на вход.

Когда я пробую ваш пример размещенной службы в новом приложении ASP.NET Core, он работает просто отлично, поэтому, если он не работает для вас, то, очевидно, ваша фактическая реализация KontolerTimer не верна .

0
ответ дан poke 20 January 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: