Служба ядра asp.net спит после отсутствия активности API - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть служба, которая проверяет учетную запись электронной почты каждую минуту.Я также использую MVC с Web API 2.1.Чтобы запустить мой размещенный сервис, я должен «разбудить его», вызвав методы API.После периода бездействия веб-API размещенная служба переходит в спящий режим и прекращает проверку электронной почты.Это похоже на сбор мусора.Как заставить его работать непрерывно?

Помощь будет принята с благодарностью.

Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info {Title = "CAS API", Version = "v1"});

                // Set the comments path for the Swagger JSON and UI.
                var xmlFile = $"{Assembly.GetEntryAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                c.IncludeXmlComments(xmlPath);
            })

            .AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                    builder => builder.WithOrigins(Configuration["uiOrigin"])
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .AllowCredentials());
            })
            .AddHostedService<EmailReceiverHostedService>()
            .Configure<EmailSettings>(Configuration.GetSection("IncomingMailSettings"))
            .AddSingleton<IEmailProcessor, MailKitProcessor>()
            .AddSingleton<IEmailRepository, EmailRepository>()


          ...

EmailReceiverHostedService.cs: ​​

using CasEmailProcessor.Options;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Threading;
using System.Threading.Tasks;

public class EmailReceiverHostedService : IHostedService, IDisposable
{
    private readonly ILogger _logger;
    private readonly Timer _timer;
    private readonly IEmailProcessor _processor;
    private readonly EmailSettings _emailConfig;


    public EmailReceiverHostedService(ILoggerFactory loggerFactory,
        IOptions<EmailSettings> settings,
        IEmailProcessor emailProcessor)
    {
        _logger = loggerFactory.CreateLogger("EmailReceiverHostedService");
        _processor = emailProcessor;
        _emailConfig = settings.Value;
        _timer = new Timer(DoWork, null, Timeout.Infinite, Timeout.Infinite);
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is starting.");
        StartTimer();
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is stopping.");
        StopTimer();

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }

    private void StopTimer()
    {
        _timer?.Change(Timeout.Infinite, 0);
    }
    private void StartTimer() { _timer.Change(TimeSpan.FromSeconds(_emailConfig.TimerIntervalInSeconds), TimeSpan.FromSeconds(_emailConfig.TimerIntervalInSeconds)); }

    private void DoWork(object state)
    {
        StopTimer();
        _processor.Process();
        StartTimer();
    }
}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я создаю задачу в планировщике событий Windows для доступа к URL-адресу для активации службы.

powershell.exe -command {Invoke-WebRequest http://localhost:8080}

0 голосов
/ 20 сентября 2018

Как вы уже думали, основной причиной является то, что ваш хост может быть отключен из-за перезагрузки пула приложений при размещении в IIS.Это было указано ниже:

Важно отметить, что способ развертывания ASP.NET Core WebHost или .NET Core Host может повлиять на окончательное решение.Например, если вы развернете свой WebHost в IIS или обычной службе приложений Azure, ваш хост может быть отключен из-за перезагрузки пула приложений.

Соображения и рекомендации по развертыванию

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

В связи с перезапуском IIS по умолчанию, вы можете рассмотреть различные подходы к хостингу:

  • Использование службы Windows

  • ИспользованиеDocker Container (Windows Container), но для этого вам понадобится Windows Server 2016 или более поздняя версия.

  • Использование функций Azure

Для вашегоВ этом случае вы можете попробовать Host ASP.NET Core в службе Windows

...