private void _handleAlertNotification(InvokeRequest request) { Uri uri = new Uri("http://localhost" + request.Parameters[SensolusConstants.PATH].Value <string>()); if (uri.Segments.Length <= 1) { return; } string context = uri.Segments[1].Replace("/", ""); if (!connCfgs.ContainsKey(context)) { return; } SensolusCfg cfg = connCfgs[context]; var query = System.Web.HttpUtility.ParseQueryString(uri.Query); DateTime start = DateTime.Now; DataProcessor dp = new DataProcessor(cfg); IDbTransaction transaction = null; string serial = ""; try { var connectionStringBuilder = NpgsqlFactory.Instance.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(NpgsqlFactory.Instance, connectionStringBuilder.ToString())) { client.Open(); transaction = client.BeginTransaction(); //dp.FirstPhase(client); serial = request.Parameters[SensolusConstants.SERIAL]?.Value <string>(); FactActivity latestActivity = client.GetLatestActivity(serial); int halfMinutes = (int)Math.Ceiling((DateTime.Now - latestActivity.Evttime).TotalMinutes / 2); List <DimTracker> trackers = new List <DimTracker>(); DimTracker tracker = client.GetDimTracker(serial); if (tracker == default(DimTracker)) { dp.FirstPhase(client); tracker = client.GetDimTracker(serial); } trackers.Add(tracker); dp.SecondPhase(client, halfMinutes, trackers); dp.ThirdPhase(client, new string[] { serial }); transaction.Commit(); } } catch (SqlException e) { Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); transaction?.Rollback(); return; } catch (ArgumentException e) { //wrong SQL Connection string Serilog.Log.Error("Wrong SQL Connection string: " + $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password=*****"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } catch (Exception e) { Serilog.Log.Error("Unexpected error"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } TimeSpan duration = DateTime.Now - start; try { var connectionStringBuilder = NpgsqlFactory.Instance.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(NpgsqlFactory.Instance, connectionStringBuilder.ToString())) { client.Open(); IDbCommand cmd = client.CreateCommand(); cmd.CommandText = $"INSERT INTO log (ts, duration, reqcount, initevent, serial) VALUES ({SqlConvert.Convert(DateTime.Now)}, {duration.TotalMilliseconds}, {dp.api.Count}, 'PN', {SqlConvert.Convert(serial)})"; cmd.ExecuteNonQuery(); } } catch (Exception e) { Serilog.Log.Error("Could not make log record"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } Serilog.Log.Information($"ts: {DateTime.Now}, duration: {duration.TotalMilliseconds}, reqCount: {dp.api.Count}, initevent: PN, serial: {serial}"); }