using Newtonsoft.Json; using RestSharp; using SteamWare; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Web; using static GPW_data.LiManObj; namespace GPW_data { public class licenzeGPW { #region Private Fields private static string _applicazione = memLayer.ML.confReadString("appName"); /// /// Url di base chiamate API gestione licenze /// //private static string apiUrl = "https://localhost:44351/"; private static string apiUrl = "https://liman.egalware.com/ELM.API/"; private static string rkeyInstall = memLayer.ML.redHash($"LiMan:Install"); private static string rkeyNumInstall = memLayer.ML.redHash($"LiMan:NumInstall"); private static string rkeyAuth = memLayer.ML.redHash($"LiMan:Auth"); private static string rkeyMKey = memLayer.ML.redHash($"LiMan:rkeyMKey"); private static string rkeyActInfo = memLayer.ML.redHash($"LiMan:ActInfo"); private static string rkeyDipAct = memLayer.ML.redHash($"LiMan:DipAct"); private static string rkeyAppInfo = memLayer.ML.redHash($"LiMan:AppInfo"); private static string rkeyLicInfo = memLayer.ML.redHash($"LiMan:LicInfo"); private static string rkeyPayload = memLayer.ML.redHash($"LiMan:Payload"); private static string rkeyTickets = memLayer.ML.redHash($"LiMan:Tickets"); private static string rkeyVetoRefPayL = memLayer.ML.redHash($"LiMan:VetoRefPayL"); private static int cacheTTL = 60 * 5; #endregion Private Fields #region Public Properties /// /// nome applicazione sw /// public static string applicazione => _applicazione; /// /// numero di licenze attive da info online /// public static int attivazioniOnline => _attivazioniOnline(); /// /// chaive licenza /// public static string authKey => _authKey(); /// /// verifica se numero licenze copre utenti attivi... /// public static bool checkLicenze => _checkLicenze(); /// /// verifica se il payload delle licenze attivate sia valido (con server online) /// public static bool checkPayload => _checkPayload(); /// /// nome installazione sw /// public static string installazione => _installazione(); /// /// numero di licenze attive sul sw (SE CONFORMI A CHIAVE) /// public static int licenzeAttive => _licenzeAttive(); /// /// numero di licenze attive su DB (NON verificate!) /// public static int licenzeDb => _licenzeDb(); /// /// numero di licenze disponibili da info online /// public static int licenzeOnline => _licenzeOnline(); /// /// Elenco attivazioni attuali /// public static List ListaAttivazioni => _ListaAttivazioni(); /// /// Chiave Licenza Master /// public static string MasterKey => _MasterKey(); /// /// modalità applicazione (pagina test.aspx) /// public static string modApp => _modApp(); /// /// numero di Ticket APERTI /// public static int numTickets => getNumTickets().Result; /// /// scadenza licenze x applicativo /// public static DateTime scadenzaLicenza => _scadenzaLicenza(); /// /// Elenco dei Ticket da info online /// public static List TicketsList => getTickets().Result; /// /// numero di utenti attivi /// public static int utentiAttivi => _utentiAttivi(); #endregion Public Properties #region Private Properties /// /// Info applicativo corrente (da cache con eventuale recupero online...) /// private static LiManObj.ApplicativoDTO InfoApplicativo { get { LiManObj.ApplicativoDTO answ = new LiManObj.ApplicativoDTO(); // cerco da cache string rawData = memLayer.ML.getRSV(rkeyLicInfo); // se no ci fosse --> refresh online! if (string.IsNullOrEmpty(rawData)) { var fatto = RefreshAppInfo().Result; if (fatto) { rawData = memLayer.ML.getRSV(rkeyLicInfo); } } if (!string.IsNullOrEmpty(rawData)) { try { // verifico se ho 1 risultato o molti...se inizia per "[" è molti if (rawData.StartsWith("[")) { // POTREBBE darmi + di 1 risultato, prendo + recente... List infoList = JsonConvert.DeserializeObject>(rawData); if (infoList != null) { answ = infoList.OrderByDescending(x => x.Scadenza).FirstOrDefault(); } } else { answ = JsonConvert.DeserializeObject(rawData); } } catch { } } return answ; } } /// /// Durata cache statica locale dati licenza, random circa 1 h /// private static int LicCacheTTL { get { Random rndGen = new Random(); return rndGen.Next(50, 70) * 60; } } private static LiManObj.ApplicativoDTO myInfoApplicativo { get; set; } #endregion Private Properties #region Public Methods /// /// Verifica attivazione licenza dato codice impiego /// /// /// public static async Task checkActivation(string CodImpiego) { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/attivazioni/verifica?chiave={MKeyEnc}&CodImpiego={CodImpiego}", DataFormat.Json); var response = client.Get(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta string rawData = response.Content; try { // deserializzo AttivazioneDTO datiAttivazione = JsonConvert.DeserializeObject(rawData); answ = datiAttivazione != null && datiAttivazione.CodImpiego == CodImpiego; } catch { } } return await Task.FromResult(answ); } /// /// Verifica attivazione licenza dato codice impiego /// /// /// public static async Task checkActivationUnlocked(string CodImpiego) { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/attivazioni/verifica?chiave={MKeyEnc}&CodImpiego={CodImpiego}", DataFormat.Json); var response = client.Get(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta string rawData = response.Content; try { // deserializzo AttivazioneDTO datiAttivazione = JsonConvert.DeserializeObject(rawData); if (datiAttivazione != null) { // verifico se il veto sia scaduto answ = datiAttivazione.VetoUnlock <= DateTime.Today; } } catch { } } return await Task.FromResult(answ); } /// /// Effettua refresh ActivationInfo con chiamata remota (sovrascrivendo info locali Redis) /// /// public static async Task RefreshActInfo() { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/attivazioni/?chiave={MKeyEnc}", DataFormat.Json); var response = client.Get(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { answ = true; // salvo in redis contenuto serializzato string rawData = response.Content; // salvo in redis per 7 gg memLayer.ML.setRSV(rkeyActInfo, rawData, LicCacheTTL); } return await Task.FromResult(answ); } /// /// Effettua refresh AppInfo con chiamata remota (sovrascrivendo info locali Redis) /// /// public static async Task RefreshAppInfo() { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); var request = new RestRequest($"/api/applicazione/{installazione}?CodApp={applicazione}", DataFormat.Json); var response = client.Get(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { answ = true; // salvo in redis contenuto serializzato string rawData = response.Content; // salvo in redis per 7 gg memLayer.ML.setRSV(rkeyAppInfo, rawData, LicCacheTTL); } return await Task.FromResult(answ); } /// /// Effettua refresh LicenseInfo con chiamata remota (sovrascrivendo info locali Redis) /// /// public static async Task RefreshLicInfo() { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/licenza/{installazione}?CodApp={applicazione}&Chiave={MKeyEnc}", DataFormat.Json); var response = client.Get(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { answ = true; // salvo in redis contenuto serializzato string rawData = response.Content; // salvo in redis per 7 gg memLayer.ML.setRSV(rkeyLicInfo, rawData, LicCacheTTL); } return await Task.FromResult(answ); } /// /// Effettua refresh Payload su server (Remoto) e recupera info licenza in locale (sovrascrivendo info locali Redis) /// /// public static async Task RefreshPayload() { bool answ = false; // svuoto payload calcolato in primis (ttl a 1 sec)... memLayer.ML.setRSV(rkeyPayload, "", 1); // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/licenza/refreshPayload", DataFormat.Json); string newEnigma = calcHash($"{DateTime.Now:yyyyMMddHHmmss}"); LicenseCoord newBody = new LicenseCoord() { MasterKey = MasterKey, CodInst = installazione, CodApp = applicazione, Enigma = newEnigma }; request.AddJsonBody(newBody); var response = client.Post(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { answ = true; // salvo in redis contenuto serializzato string rawData = response.Content; // salvo in redis per 7 gg memLayer.ML.setRSV(rkeyLicInfo, rawData, LicCacheTTL); } return await Task.FromResult(answ); } /// /// Tenta invio di un ticket x licenza indicata /// /// /// /// /// /// /// /// public static async Task sendTicketReq(string contName, string contEmail, string contPhone, string reqBody, string codImpiego, int idxSubLic) { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/ticket/sendReq", DataFormat.Json); SupportRequest richiesta = new SupportRequest() { ContactName = contName, ContactEmail = contEmail, ContactPhone = contPhone, ReqBody = reqBody, CodInst = installazione, CodApp = applicazione, MasterKey = MasterKey, idxSubLic = idxSubLic, CodImp = codImpiego }; request.AddJsonBody(richiesta); var response = client.Post(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta string rawData = response.Content; try { if (rawData.StartsWith("[")) { // deserializzo List tickets = JsonConvert.DeserializeObject>(rawData); answ = tickets != null; } else { // deserializzo singolo TicketDTO tickets = JsonConvert.DeserializeObject(rawData); answ = tickets != null; } } catch { } } return await Task.FromResult(answ); } /// /// Tenta attivazione licenza dato codice impiego /// /// /// public static async Task tryActivation(string CodImpiego, string Chiave) { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/attivazioni", DataFormat.Json); Dictionary parDict = new Dictionary(); parDict.Add(CodImpiego, Chiave); UserLicenseRequest newBody = new UserLicenseRequest() { MasterKey = MasterKey, ParamDict = parDict }; request.AddJsonBody(newBody); var response = client.Post(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta string rawData = response.Content; try { // deserializzo AttivazioneDTO datiAttivazione = JsonConvert.DeserializeObject(rawData); answ = datiAttivazione != null; } catch { } } return await Task.FromResult(answ); } /// /// Tenta attivazione licenze dato dizionario codici impiego + chiavi /// /// Dizionario parametri attivazione di tipo (CodImpiego,Chiave) /// public static async Task tryActivationMult(Dictionary ParamsList) { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/attivazioni", DataFormat.Json); UserLicenseRequest newBody = new UserLicenseRequest() { MasterKey = MasterKey, ParamDict = ParamsList }; request.AddJsonBody(newBody); var response = client.Post(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta string rawData = response.Content; try { if (rawData.StartsWith("[")) { // deserializzo List datiAttivazione = JsonConvert.DeserializeObject>(rawData); answ = datiAttivazione != null; } else { // deserializzo singolo AttivazioneDTO datiAttivazione = JsonConvert.DeserializeObject(rawData); answ = datiAttivazione != null; } } catch { } } return await Task.FromResult(answ); } /// /// Tenta disattivazione licenza dato codice impiego /// /// Dizionario codici da eliminare (CodImpiego/uSERkEY) /// public static async Task tryDeactivation(Dictionary ParamsList) { bool answ = false; // cerco attivazione... var refreshDone = RefreshActInfo().Result; if (refreshDone) { // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); var request = new RestRequest($"/api/attivazioni", DataFormat.Json); UserLicenseRequest newBody = new UserLicenseRequest() { MasterKey = MasterKey, ParamDict = ParamsList }; request.AddJsonBody(newBody); var response = client.Delete(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta string rawData = response.Content; bool.TryParse(rawData, out answ); } } return await Task.FromResult(answ); } /// /// Tenta refresh licenza dato codice impiego (aggiorna la authKey...) /// /// /// public static async Task tryRefreshActivation(string CodImpiego, string Chiave) { bool answ = false; // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/attivazioni/refreshKey", DataFormat.Json); Dictionary parDict = new Dictionary(); parDict.Add(CodImpiego, Chiave); UserLicenseRequest newBody = new UserLicenseRequest() { MasterKey = MasterKey, ParamDict = parDict }; request.AddJsonBody(newBody); var response = client.Post(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta string rawData = response.Content; try { if (rawData.StartsWith("[")) { // deserializzo List datiAttivazione = JsonConvert.DeserializeObject>(rawData); answ = datiAttivazione != null; } else { // deserializzo singolo AttivazioneDTO datiAttivazione = JsonConvert.DeserializeObject(rawData); answ = datiAttivazione != null; } } catch { } } return await Task.FromResult(answ); } public static bool userPayloadOk(int idxDip) => _userPayloadOk(idxDip); #endregion Public Methods #region Private Methods /// /// numero di licenze attive da info online /// private static int _attivazioniOnline() { return InfoApplicativo.NumLicenzeAttive; } /// /// chiave licenza /// private static string _authKey() { // cerco in redis string answ = memLayer.ML.getRSV(rkeyAuth); // se non trovato --> DB if (string.IsNullOrEmpty(answ)) { // altrimenti DB... try { answ = DataProxy.DP.taAKV.getByKey(installazione)[0].valString; // salvo x 5 min memLayer.ML.setRSV(rkeyAuth, answ, cacheTTL); } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore recupero chiave auth da AKV: {0}", exc), tipoLog.EXCEPTION); } } return answ; } /// /// verifica se numero licenze copre utenti attivi... /// private static bool _checkLicenze() { bool answ = false; bool fatto = false; try { // cerco da cache string rawData = memLayer.ML.getRSV(rkeyActInfo); // se non ci fosse --> refresh online! if (string.IsNullOrEmpty(rawData)) { // effettua refresh attivazioni... fatto = RefreshActInfo().Result; } answ = utentiAttivi <= licenzeAttive; if (!answ && memLayer.ML.confReadInt("_logLevel") > 5) { logger.lg.scriviLog(string.Format("WARNING licenze: utenti attivi {0} / licenziati {1}", utentiAttivi, licenzeAttive), tipoLog.WARNING); } } catch { } return answ; } /// /// verifica se il payload delle licenze attivate sia valido (con server online) /// private static bool _checkPayload() { bool answ = false; string currPayload = ""; tryCheckPayloadOnline(ref answ, ref currPayload); // se OK resetto counter, altrimenti incremento if (!answ) { bool okRefreshPayload = string.IsNullOrEmpty(memLayer.ML.getRSV(rkeyVetoRefPayL)); if (okRefreshPayload) { Stopwatch sw = new Stopwatch(); sw.Start(); // richiedo update payload impostando TTL a 1 sec... memLayer.ML.setRSV(rkeyPayload, "", 1); var okApp = RefreshAppInfo().Result; var okLic = RefreshActInfo().Result; var okAct = RefreshLicInfo().Result; var okPld = RefreshPayload().Result; // evito ricalcolo x 5 sec... memLayer.ML.setRSV(rkeyVetoRefPayL, "Veto", 5); sw.Stop(); logger.lg.scriviLog($"Trovato payload non valido, effettuato reset variabili in {sw.ElapsedMilliseconds} ms"); sw.Start(); tryCheckPayloadOnline(ref answ, ref currPayload); sw.Stop(); logger.lg.scriviLog($"Rivalutato payload con esito {answ} in {sw.ElapsedMilliseconds} ms"); } } return answ; } /// /// nome installazione sw /// private static string _installazione() { // cerco in redis string answ = memLayer.ML.getRSV(rkeyInstall); // se non trovato --> DB if (string.IsNullOrEmpty(answ)) { // altrimenti DB... try { answ = DataProxy.DP.taAKV.getByKey("installazione")[0].valString; // salvo x 5 min memLayer.ML.setRSV(rkeyInstall, answ, cacheTTL); } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore recupero chiave installazione da AKV: {0}", exc), tipoLog.EXCEPTION); } } return answ; } /// /// numero di licenze attive sul sw (SE CONFORMI A CHIAVE) /// private static int _licenzeAttive() { int answ = 0; int licenzeMax = licenseMan.getLicenseNum(installazione, applicazione); // verifico dato su DB sia valido... expiry date con quel numero sia > della data odierna if (scadenzaLicenza >= DateTime.Today) { answ = licenzeDb; } else { answ = licenzeMax; } return answ; } /// /// numero di licenze attive su DB (NON verificate!) /// private static int _licenzeDb() { int answ = 0; string rawData = memLayer.ML.getRSV(rkeyNumInstall); // se non trovato --> DB if (string.IsNullOrEmpty(rawData)) { // altrimenti DB... try { answ = DataProxy.DP.taAKV.getByKey(installazione)[0].valInt; // salvo x 5 min memLayer.ML.setRSV(rkeyNumInstall, $"{answ}", cacheTTL); } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore recupero num lic da AKV: {0}", exc), tipoLog.EXCEPTION); } } else { int.TryParse(rawData, out answ); } return answ; } /// /// numero di licenze disponibili da info online /// private static int _licenzeOnline() { return InfoApplicativo.NumLicenze; } /// /// Elenco attivazioni attuali /// private static List _ListaAttivazioni() { List answ = new List(); // cerco da cache string rawData = memLayer.ML.getRSV(rkeyActInfo); // se non ci fosse --> refresh online! if (string.IsNullOrEmpty(rawData)) { var fatto = RefreshActInfo().Result; if (fatto) { rawData = memLayer.ML.getRSV(rkeyActInfo); } } if (!string.IsNullOrEmpty(rawData)) { answ = JsonConvert.DeserializeObject>(rawData); } return answ; } /// /// Chiave Licenza Master /// private static string _MasterKey() { // cerco in redis string answ = memLayer.ML.getRSV(rkeyMKey); // se non trovato --> DB if (string.IsNullOrEmpty(answ)) { // altrimenti DB... try { answ = DataProxy.DP.taAKV.getByKey(installazione)[0].valString; // salvo x 5 min memLayer.ML.setRSV(rkeyMKey, answ, cacheTTL); } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore recupero chiave MasterKey da AKV: {0}", exc), tipoLog.EXCEPTION); } } return answ; } /// /// modalità applicazione (pagina test.aspx) /// private static string _modApp() { string answ = ""; try { answ = DataProxy.DP.taAKV.getByKey("appMode")[0].valString; } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore recupero chiave appMode da AKV: {0}", exc), tipoLog.EXCEPTION); } return answ; } /// /// scadenza licenze x applicativo /// private static DateTime _scadenzaLicenza() { DateTime answ = licenseMan.expiryDateByAuthKey(installazione, applicazione, licenzeDb, authKey); return answ; } private static bool _userPayloadOk(int idxDip) { bool answ = false; try { // recupero riga dip var userRow = DataProxy.DP.getRowDip(idxDip); if (userRow != null) { // calcolo suo codice... var codImpCurr = DataProxy.DP.hashCodImpiego(userRow); // cerco dip tra elenco json var userLocalList = ListaAttivazioni; var foundRec = userLocalList.Where(x => x.CodImpiego == codImpCurr); answ = foundRec.Count() > 0; } } catch { } return answ; } /// /// numero di utenti attivi /// private static int _utentiAttivi() { return getDipAttivi().Count; } public static DS_Applicazione.DipendentiDataTable getDipAttivi() { DS_Applicazione.DipendentiDataTable answ = new DS_Applicazione.DipendentiDataTable(); // cerco da cache string rawData = memLayer.ML.getRSV(rkeyDipAct); // se no ci fosse --> refresh online! if (string.IsNullOrEmpty(rawData)) { answ = DataProxy.DP.taDipendenti.getAttivi(false); rawData = JsonConvert.SerializeObject(answ); memLayer.ML.setRSV(rkeyDipAct, rawData, cacheTTL); } else { answ = JsonConvert.DeserializeObject(rawData); } return answ; } /// /// Calcolo Hash data stringa input /// /// /// private static string calcHash(string rawData) { string hash = ""; // hashing! using (var md5 = MD5.Create()) { byte[] InputBytes = Encoding.UTF8.GetBytes(rawData); var byteHash = md5.ComputeHash(InputBytes); hash = BitConverter.ToString(byteHash).Replace("-", "").ToLowerInvariant(); } return hash; } private static string calcPayload() { string answ = ""; // costruisco stringa da elenco impieghi... StringBuilder sb = new StringBuilder(); // ciclo tutti gli utenti attivi var localUserList = getDipAttivi(); List codiciImpiego = new List(); // ciclo x ogni dip attivo... foreach (var item in localUserList) { codiciImpiego.Add(DataProxy.DP.hashCodImpiego(item)); } // riordino var ordList = codiciImpiego.OrderBy(x => x); foreach (var item in ordList) { sb.AppendLine(item); } string rawData = sb.ToString(); // hashing! using (var md5 = MD5.Create()) { byte[] InputBytes = Encoding.UTF8.GetBytes(rawData); var byteHash = md5.ComputeHash(InputBytes); answ = BitConverter.ToString(byteHash).Replace("-", "").ToLowerInvariant(); } return answ; } /// /// Recupera num ticket da sistema LiMan online /// /// private static async Task getNumTickets() { var elenco = await getTickets(); var openTickets = elenco .Where(x => x.Status <= StatoRichiesta.Valutazione) .ToList(); return await Task.FromResult(openTickets.Count); } /// /// Recupera num ticket da sistema LiMan online /// /// private static async Task> getTickets() { List answ = new List(); // cerco in cache locale... string rawData = memLayer.ML.getRSV(rkeyTickets); if (!string.IsNullOrEmpty(rawData)) { answ = JsonConvert.DeserializeObject>(rawData); } // se vuoto rileggo if (answ.Count == 0) { // cerco online RestClient client = new RestClient(apiUrl); //client.Authenticator = new HttpBasicAuthenticator("username", "password"); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"/api/ticket/{installazione}?CodApp={applicazione}&Chiave={MKeyEnc}", DataFormat.Json); var response = client.Get(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // salvo in redis contenuto serializzato rawData = response.Content; // deserializzo answ = JsonConvert.DeserializeObject>(rawData); // salvo in redis per TTL std memLayer.ML.setRSV(rkeyTickets, rawData, 20); } } return await Task.FromResult(answ); } public static void resetTicketCache() { // resetto cache tickets a 1 sec e vuoto memLayer.ML.setRSV(rkeyTickets, "", 1); // ricarico var newList = getTickets(); } private static void tryCheckPayloadOnline(ref bool answ, ref string currPayload) { try { // cerco payload licenze locale... currPayload = memLayer.ML.getRSV(rkeyPayload); // se no ci fosse --> refresh online! if (string.IsNullOrEmpty(currPayload)) { currPayload = calcPayload(); memLayer.ML.setRSV(rkeyPayload, currPayload, LicCacheTTL); } // confronto payload calc con quello della licenza var currInfo = InfoApplicativo; answ = (InfoApplicativo.Payload == currPayload); // se fallisce --> resetto payload calcolato if (!answ) { memLayer.ML.setRSV(rkeyAppInfo, "", 1); memLayer.ML.setRSV(rkeyPayload, "", 1); } } catch { } } #endregion Private Methods } }