#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, если таковые имеются, вы используете)