From 1b36765ae3a4496407fdecadbe641dd9e4b8e2d1 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 13 Mar 2026 09:32:43 +0100 Subject: [PATCH] Fix chiamate httpclient al posto di webclient x GWMS (da ri-testare in generale) --- IOB-UT-NEXT/baseUtils.cs | 140 ++++++++++++++++++--- IOB-WIN-FORM/Iob/Generic.Protected.cs | 18 +-- IOB-WIN-FORM/Iob/Generic.Public.cs | 2 +- IOB-WIN-FORM/MainForm.cs | 2 +- IOB-WIN-SIEMENS/DATA/CONF/PIZ03.json | 4 +- IOB-WIN-SIEMENS/IobSiemens/SiemensFape.cs | 2 +- IOB-WIN-SIEMENS/IobSiemens/SiemensTorri.cs | 6 +- 7 files changed, 141 insertions(+), 33 deletions(-) diff --git a/IOB-UT-NEXT/baseUtils.cs b/IOB-UT-NEXT/baseUtils.cs index 3346c9b4..a6317a81 100644 --- a/IOB-UT-NEXT/baseUtils.cs +++ b/IOB-UT-NEXT/baseUtils.cs @@ -258,7 +258,7 @@ namespace IOB_UT_NEXT // controllo se ho un VETO all'invio... if (dtVetoSend < DateTime.Now) { - answ = callUrlNow(URL); + answ = CallUrlGet(URL); } return answ; } @@ -275,7 +275,7 @@ namespace IOB_UT_NEXT // controllo se ho un VETO all'invio... if (dtVetoSend < DateTime.Now) { - answ = callUrlNow(URL, payload); + answ = CallUrlPost(URL, payload); } // restituisco valore! return answ; @@ -351,20 +351,16 @@ namespace IOB_UT_NEXT } } +#if false /// - /// Effettua chiamata URL IMMEDIATAMENTE e restituisce risultato + /// Effettua chiamata URL IMMEDIATAMENTE e restituisce risultato LEGACY /// /// /// + [Obsolete("Obsoleto passare a CallUrlGet")] public static string callUrlNow(string URL) { string answ = ""; -#if false - if (client == null) - { - client = new WebClientWT(); - } -#endif using (WebClient client = new WebClient()) { client.Headers.Add("user-agent", CRS("appName")); @@ -394,27 +390,75 @@ namespace IOB_UT_NEXT } // restituisco valore! return answ; + } +#endif + + /// + /// Effettua chiamata URL IMMEDIATAMENTE e restituisce risultato + /// + /// + /// + public static string CallUrlGet(string URL) + { + try + { + // Gestione certificati self-signed + HttpClientHandler handler = new HttpClientHandler(); + if (URL.Contains("10.74.82.")) + { + handler.ServerCertificateCustomValidationCallback = + HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; + } + + using (var client = new HttpClient(handler)) + { + // Timeout personalizzabile + client.Timeout = TimeSpan.FromMilliseconds(5000); + + // Header custom + client.DefaultRequestHeaders.UserAgent.ParseAdd(CRS("appName")); + + // GET sincrona + var response = client.GetAsync(URL).Result; + + string answ = response.Content.ReadAsStringAsync().Result; + + return answ; + } + } + catch (Exception exc) + { + int pauseSendMSec = nextPauseSendMSec; + dtVetoSend = DateTime.Now.AddMilliseconds(pauseSendMSec); + + if (logValuePermit(URL)) + { + lg.Error($"CallUrlGet | Errore chiamando {URL} | wait {pauseSendMSec} ms{Environment.NewLine}Eccezione:{Environment.NewLine}{exc}"); + } + + return ""; + } } + + +#if false /// /// Effettua chiamata IMMEDIATAMENTE URL e restituisce risultato /// /// /// /// + [Obsolete("Obsoleto passare a CallUrlGet")] public static string callUrlNow(string URL, string payload) { string answ = ""; -#if false - if (clientPayload == null) - { - clientPayload = new WebClientWT(); - } -#endif using (WebClient clientPayload = new WebClient()) { clientPayload.Headers.Add("user-agent", $"{CRS("appName")}-PAYLOAD"); - clientPayload.Headers.Add("Content-ContextType", "application/json"); + clientPayload.Encoding = Encoding.UTF8; + //clientPayload.Headers.Add("Content-ContextType", "application/json"); + clientPayload.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8"); try { // problema certificati locali... @@ -424,7 +468,7 @@ namespace IOB_UT_NEXT { System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; }; } - answ = clientPayload.UploadString(URL, payload); + answ = clientPayload.UploadString(URL, "POST", payload); if (answ != "OK") { // controllo log permesso... @@ -447,9 +491,71 @@ namespace IOB_UT_NEXT } } // restituisco valore! + return answ; + } +#endif + + /// + /// Effettua chiamata IMMEDIATAMENTE URL e restituisce risultato + /// + /// + /// + /// + public static string CallUrlPost(string URL, string payload) + { + string answ = ""; + + try + { + // Gestione certificati self-signed + HttpClientHandler handler = new HttpClientHandler(); + if (URL.Contains("10.74.")) + { + handler.ServerCertificateCustomValidationCallback = + HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; + } + + using (var client = new HttpClient(handler)) + { + // Timeout personalizzabile + client.Timeout = TimeSpan.FromMilliseconds(5000); + + // Header custom + client.DefaultRequestHeaders.UserAgent.ParseAdd($"{CRS("appName")}-PAYLOAD"); + + // Corpo JSON + var content = new StringContent(payload, Encoding.UTF8, "application/json"); + + // POST sincrono + var response = client.PostAsync(URL, content).Result; + + answ = response.Content.ReadAsStringAsync().Result; + + // Log identico al tuo + if (answ != "OK") + { + if (logValuePermit($"{URL}|[{answ}]")) + { + lg.Error($"CallUrlPost | POST fallito | ans: [{answ}]:{Environment.NewLine}- URL{Environment.NewLine}{URL}{Environment.NewLine}- payload{Environment.NewLine}{payload}"); + } + } + } + } + catch (Exception exc) + { + int pauseSendMSec = nextPauseSendMSec; + dtVetoSend = DateTime.Now.AddMilliseconds(pauseSendMSec); + + if (logValuePermit(URL)) + { + lg.Error($"CallUrlPost | Errore chiamando {URL} | wait {pauseSendMSec} ms | Dump Payload:{Environment.NewLine}{payload}{Environment.NewLine}Eccezione:{Environment.NewLine}{exc}"); + } + } + return answ; } + /// /// Test esistenza/creazione directory /// diff --git a/IOB-WIN-FORM/Iob/Generic.Protected.cs b/IOB-WIN-FORM/Iob/Generic.Protected.cs index 67255f36..f28a4c18 100644 --- a/IOB-WIN-FORM/Iob/Generic.Protected.cs +++ b/IOB-WIN-FORM/Iob/Generic.Protected.cs @@ -1682,7 +1682,7 @@ namespace IOB_WIN_FORM.Iob { lgInfo("chiamata URL " + url2call); } - var rawData = utils.callUrlNow(url2call); + var rawData = utils.CallUrlGet(url2call); // deserializzo e recupero KVP... var dictArtSrv = JsonConvert.DeserializeObject>(rawData); // se fosse una chiamata con valore vuoto --> salvo intera tabella... @@ -1729,7 +1729,7 @@ namespace IOB_WIN_FORM.Iob lgInfo("chiamata URL " + url2call); } // รจ direttamente il risultato! - answ = utils.callUrlNow(url2call); + answ = utils.CallUrlGet(url2call); } // restituisco return answ; @@ -1747,11 +1747,11 @@ namespace IOB_WIN_FORM.Iob { lgInfo("chiamata URL " + url2call); } - answ = utils.callUrlNow(url2call); + answ = utils.CallUrlGet(url2call); // se vuoto faccio seconda prova... if (string.IsNullOrEmpty(answ) || answ == "[]") { - answ = utils.callUrlNow(url2call); + answ = utils.CallUrlGet(url2call); } return answ; } @@ -4294,7 +4294,7 @@ namespace IOB_WIN_FORM.Iob numIncr = delta > maxSendPzCountBlock + minSendPzCountBlock ? maxSendPzCountBlock : delta - minSendPzCountBlock; // invio il num max di pezzi ammesso in blocco! lastUrl = $"{urlAddPzCount}{numIncr}".Replace(IOBConfFull.General.CodIOB, fullCode); - string resp = utils.callUrlNow(lastUrl); + string resp = utils.CallUrlGet(lastUrl); if (!string.IsNullOrEmpty(resp)) { // dalla risposta (come numero) capisco SE ha aggiunto i pezzi (e quanti) @@ -4368,7 +4368,7 @@ namespace IOB_WIN_FORM.Iob numIncr = delta > maxSendPzCountBlock + minSendPzCountBlock ? maxSendPzCountBlock : delta - minSendPzCountBlock; // invio il num max di pezzi ammesso in blocco! lastUrl = $"{urlAddPzCount}{numIncr}"; - string resp = utils.callUrlNow(lastUrl); + string resp = utils.CallUrlGet(lastUrl); if (!string.IsNullOrEmpty(resp)) { // dalla risposta (come numero) capisco SE ha aggiunto i pezzi (e quanti) @@ -5294,7 +5294,8 @@ namespace IOB_WIN_FORM.Iob lgInfo($"Chiamata di plcWriteParams da processMem2Write: {updatedPar.Count} updatedPar"); plcWriteParams(ref updatedPar); // invio su cloud parametri! - utils.callUrl($"{urlUpdateWriteParams}", JsonConvert.SerializeObject(updatedPar)); + string rawData = JsonConvert.SerializeObject(updatedPar); + utils.CallUrlPost($"{urlUpdateWriteParams}", rawData); lgInfo($"Notificato a server scrittura {updatedPar.Count} parametri"); } else @@ -5303,7 +5304,8 @@ namespace IOB_WIN_FORM.Iob if (currWritePar.Count > 0 && (lastWriteParamsUpsert.AddMinutes(vetoSendWriteUpsert) < adesso)) { // invio su cloud parametri! - var res = utils.callUrl($"{urlUpdateWriteParams}", JsonConvert.SerializeObject(currWritePar)); + string rawData = JsonConvert.SerializeObject(currWritePar); + var res = utils.CallUrlPost($"{urlUpdateWriteParams}", rawData); lgInfo($"Reinviato a server stato {updatedPar.Count} parametri WRITE"); lastWriteParamsUpsert = adesso; } diff --git a/IOB-WIN-FORM/Iob/Generic.Public.cs b/IOB-WIN-FORM/Iob/Generic.Public.cs index ccc9dbc7..b54c6952 100644 --- a/IOB-WIN-FORM/Iob/Generic.Public.cs +++ b/IOB-WIN-FORM/Iob/Generic.Public.cs @@ -3356,7 +3356,7 @@ namespace IOB_WIN_FORM.Iob } string rawData = JsonConvert.SerializeObject(ActiveAlarmList); - string resp = utils.callUrlNow(lastUrl, rawData); + string resp = utils.CallUrlPost(lastUrl, rawData); //string resp = utils.callUrlAsync(lastUrl, rawData); if (resp != null) { diff --git a/IOB-WIN-FORM/MainForm.cs b/IOB-WIN-FORM/MainForm.cs index b86e3e8a..12e7d59e 100644 --- a/IOB-WIN-FORM/MainForm.cs +++ b/IOB-WIN-FORM/MainForm.cs @@ -904,7 +904,7 @@ namespace IOB_WIN_FORM // invio in locale! url2call = $"{urlDownloadFile}{currIob}"; } - rawData = utils.callUrlNow(url2call); + rawData = utils.CallUrlGet(url2call); if (!string.IsNullOrEmpty(rawData)) { // deserializzo diff --git a/IOB-WIN-SIEMENS/DATA/CONF/PIZ03.json b/IOB-WIN-SIEMENS/DATA/CONF/PIZ03.json index 24fd56f5..f5e04a51 100644 --- a/IOB-WIN-SIEMENS/DATA/CONF/PIZ03.json +++ b/IOB-WIN-SIEMENS/DATA/CONF/PIZ03.json @@ -231,7 +231,7 @@ "tipoMem": "Real", "index": 152, "size": 4, - "func": "MEDIAN", + "func": "POINT", "period": 60, "factor": 1, "unit": "C" @@ -243,7 +243,7 @@ "tipoMem": "Real", "index": 156, "size": 4, - "func": "MEDIAN", + "func": "POINT", "period": 60, "factor": 1, "unit": "C" diff --git a/IOB-WIN-SIEMENS/IobSiemens/SiemensFape.cs b/IOB-WIN-SIEMENS/IobSiemens/SiemensFape.cs index fcda93d6..ec79edac 100644 --- a/IOB-WIN-SIEMENS/IobSiemens/SiemensFape.cs +++ b/IOB-WIN-SIEMENS/IobSiemens/SiemensFape.cs @@ -198,7 +198,7 @@ namespace IOB_WIN_SIEMENS.IobSiemens { try { - currODL = utils.callUrlNow(urlGetCurrODL); + currODL = utils.CallUrlGet(urlGetCurrODL); #if false // se nullo riprovo... if (string.IsNullOrEmpty(currODL)) diff --git a/IOB-WIN-SIEMENS/IobSiemens/SiemensTorri.cs b/IOB-WIN-SIEMENS/IobSiemens/SiemensTorri.cs index e7dfb655..efcdbbe0 100644 --- a/IOB-WIN-SIEMENS/IobSiemens/SiemensTorri.cs +++ b/IOB-WIN-SIEMENS/IobSiemens/SiemensTorri.cs @@ -399,7 +399,7 @@ namespace IOB_WIN_SIEMENS.IobSiemens if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay)) { // Salvo il contapezzi della macchina - retVal = utils.callUrlNow(urlSetPzCountMAC + contapezziPLC.ToString()); + retVal = utils.CallUrlGet(urlSetPzCountMAC + contapezziPLC.ToString()); // verifica se tutto OK, ovvero conferma i pezzi inviati if (retVal != contapezziPLC.ToString()) { @@ -427,7 +427,7 @@ namespace IOB_WIN_SIEMENS.IobSiemens } // Salvo il contapezzi della macchina - retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString()); + retVal = utils.CallUrlGet(urlSetPzCount + contapezziIOB.ToString()); // verifica se tutto OK, ovvero conferma i pezzi inviati if (retVal != contapezziIOB.ToString()) { @@ -444,7 +444,7 @@ namespace IOB_WIN_SIEMENS.IobSiemens } // invio a server contapezzi (aggiornato) - retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString()); + retVal = utils.CallUrlGet(urlSetPzCount + contapezziIOB.ToString()); // verifica se tutto OK if (retVal != contapezziIOB.ToString()) {