Задать вопрос
Ответы пользователя по тегу C#
  • Как сконфигурировать Worker Service для логгирования запросов Entity Framework через NLog?

    MaxLevs
    @MaxLevs Автор вопроса
    Как верно заметил Василий Банников, для решения проблемы потребуется пакет NLog.Extensions.Logging.

    Для логирования скомпилированных запросов к базе используется метод UseLoggerFactory(ILoggerFactory). Фабрику можно создать вручную, и передаём в неё в качестве аргумента NLog.Extensions.Logging.NLogLoggerProvider для того, чтобы логирование подхватывалось NLog.

    LoggerFactory dbLoggerFactory = new LoggerFactory(new[] { new NLogLoggerProvider() });
    options.UseLoggerFactory(dbLoggerFactory);


    Стоит также отметить, что для того, чтобы NLog в этом случае использовал нужную конфигурацию (из файла NLog.conf), требуется ему на это указать в Program.cs.

    LogManager.LoadConfiguration("NLog.config");
    Ответ написан
    Комментировать
  • C#: Автоматическое переподключение UdpClient после рестарта сервера?

    MaxLevs
    @MaxLevs Автор вопроса
    Решил вопрос, отказавших от использования в качестве проверки работы сервера TCP-соединение. (Кто может подсказать, насколько такая замена вообще могла быть жизнеспособной?).

    Заменил код WaitForServerAlive() на следующий:
    Код здесь

    public async void WaitForServerAlive()
            {
                if(Debug)
                    Console.WriteLine($"[WARNING] [{ServerName}] Server is unavailable. Waiting for reconnection...");
                
                IsOnline = false;
                await Unwatch();
                
                _mcQuery.InitSocket();
                
                Timer waitTimer = null;
                waitTimer = new Timer(async obj => {
                    try
                    {
                        await _mcQuery.GetHandshake();
                        
                        IsOnline = true;
                        Watch();
                        lock (_retryCounterLock)
                        {
                            RetryCounter = 0;
                        }
                        
                        waitTimer.Dispose();
                    }
                    catch (SocketException)
                    {
                        if(Debug)
                            Console.WriteLine($"[WARNING] [{ServerName}] [WaitForServerAlive] Server doesn't response. Try to reconnect: {RetryCounter}");
                        
                        lock (_retryCounterLock)
                        {
                            RetryCounter++;
                            if (RetryCounter >= RetryMaxCount)
                            {
                                if(Debug)
                                    Console.WriteLine($"[WARNING] [{ServerName}] [WaitForServerAlive] Recreate socket");
                                
                                RetryCounter = 0;
                                _mcQuery.InitSocket();
                            }
                        }
                    }
                }, null, 500, 5000);
            }



    Здесь каждые 5 секунд мы стучим на сервер, запрашивая новый токен. На получение токена даётся 5 попыток, после чего сокет пересоздаётся, чтобы избежать ситуаций, когда сервер поднят, a данные всё равно через сокет идти не хотят. Любой удачно переданный пакет сбрасывает счетчик. Собственно сам WaitForServerAlive() вызывается если 5 раз подряд возникла неудачная попытка получить данные с сервера, это переводит приложение в режим ожидания восстановления соединения.

    Вышестоящий протокол подразумевает получение токена через хэндшейк-запрос, который возвращает результат всегда при корректно составленном запросе. Если сервер поднят, то мы получим токен. Обычно его достаточно получать раз в 30 секунд, чтобы запросы проходили. Для того, чтобы быстрее узнать о том, что сервер снова поднят, я отменяю обновление токена и вызываю похожий код раз в 5 секунд, до тех пор, пока не получу данные с сервера.
    После этого можно считать что сервер снова жив и возвращаться к штатной работе.
    Ответ написан
    Комментировать