Фоновая Служба .NET CORE Неожиданно Останавливается

#c# #.net-core #.net-5 #background-service

Вопрос:

В моем приложении у меня есть фоновая служба, которая переопределяет метод startAsync для подключения к VOIP-серверу для непрерывного прослушивания его событий.

Это приложение размещено на IIS 10 (Сервер1), а VOIP-на Centos7 (Сервер2).

Проблема в том, что метод startAsync не работает, пока я не просмотрю веб-сайт внутри IIS, также кажется, что он остановлен примерно через час, и мне нужно снова просмотреть веб-сайт, чтобы он запустился!

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

Является ли это правильным подходом для прослушивания событий другого сервера в качестве фоновой службы? Или это может быть реализовано в рамках лучшего решения?

     public class PBXEventListener : BackgroundService
    {
        private static AriClient ActionClient = new AriClient(
                    new StasisEndpoint("10.3.3.1", 8088, "asterisk", "asterisk"),
                    "HelloWorld", true);
        private readonly IHubContext<AsteriskHub> _asterHub;
        private readonly IServiceProvider _service;
        private readonly IConfiguration _configuration;
        private ConcurrentDictionary<string, string> _deviceStates = new ConcurrentDictionary<string, string>();

        public PBXEventListener(IHubContext<AsteriskHub> asterHub, IServiceProvider service, IConfiguration configuration)
        {
            _asterHub = asterHub;
            _service = service;
            _configuration = configuration;
        }

        public override Task StartAsync(CancellationToken stoppingToken)
        {
            return Task.Run(() =>
            {
                using (var scope = _service.CreateScope())
                {
                    var callStatRepo = scope.ServiceProvider.GetRequiredService<ICallStatRepository>();
                    _deviceStates = callStatRepo.GetAndSetLastStates();
                }

                ActionClient.OnConnectionStateChanged  = ActionClientOnConnectionStateChanged;
                ActionClient.OnDialEvent  = ActionClientOnDialEvent;
                ActionClient.OnChannelStateChangeEvent  = ActionClientChannelStateChangeEvent;
                ActionClient.OnDeviceStateChangedEvent  = ActionClientDeviceStateChangeEvent;

                ActionClient.Connect();

            });
        }
}
 

Комментарии:

1. Может ли быть так, что ваш пул приложений IIS переведен в спящий режим после 1 часа бездействия?

2. если вы хотите работать как фоновая служба; запускайте как фоновую службу , т. Е. службу Windows или демон Linux; приложение IIS предназначено для веб-сервера

3. Вам не следует делать это в IIS. Процессы IIS будут (и должны) периодически перезапускаться. Как говорит Марк, используйте настоящую фоновую службу.

4. @MarcGravell Спасибо Марку, но это должен быть концентратор SignalR, чтобы клиенты могли подключаться для получения событий.

5. @Mehdi честно говоря, я не вижу смысла; вы, конечно, можете настроить IIS так, чтобы он не отключался, или вы могли бы просто разместить его в Kestrel как службу Windows, а не использовать IIS (в зависимости от того, какие функции IIS, если таковые имеются, вы используете)