From 9d1b39be71f5f81d3d6b70fd5dced1e12419cbbf Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Thu, 21 May 2026 17:11:14 +0200 Subject: [PATCH] Modifiche da pi.dev x metodi http call --- IOB-UT-NEXT/Iob/Services/HttpService.cs | 308 ++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 IOB-UT-NEXT/Iob/Services/HttpService.cs diff --git a/IOB-UT-NEXT/Iob/Services/HttpService.cs b/IOB-UT-NEXT/Iob/Services/HttpService.cs new file mode 100644 index 00000000..0a63f768 --- /dev/null +++ b/IOB-UT-NEXT/Iob/Services/HttpService.cs @@ -0,0 +1,308 @@ +using NLog; +using RestSharp; +using System; +using System.Diagnostics; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace IOB_UT_NEXT.Iob.Services +{ + /// + /// Servizio dedicato alla gestione delle chiamate HTTP. + /// + public class HttpService + { + /// + /// Effettua chiamata URL e restituisce risultato, SE NON E' in veto send. + /// + public static string CallUrl(string url) + { + if (baseUtils.dtVetoSend < DateTime.Now) + { + return CallUrlGet(url); + } + return string.Empty; + } + + /// + /// Effettua chiamata URL e restituisce risultato con payload. + /// + public static string CallUrl(string url, string payload) + { + if (baseUtils.dtVetoSend < DateTime.Now) + { + return CallUrlPost(url, payload); + } + return string.Empty; + } + + /// + /// Metodo chiamata URL con POST async. + /// + public static async Task CallUrlAsync(string url, string payload, CancellationToken ct = default) + { + try + { + Stopwatch sw = Stopwatch.StartNew(); + var content = new StringContent(payload, Encoding.UTF8, "application/json"); + + using (var client = new HttpClient()) // Note: In a real app, use IHttpClientFactory + { + HttpResponseMessage response = await client.PostAsync(url, content, ct); + response.EnsureSuccessStatusCode(); + + sw.Stop(); + baseUtils.TrackUrlCall(url, sw.Elapsed); + + return await response.Content.ReadAsStringAsync(); + } + } + catch (OperationCanceledException) + { + return "Canceled"; + } + catch (Exception ex) + { + return $"Error: {ex.Message}"; + } + } + + /// + /// Metodo chiamata URL con GET async. + /// + public static async Task CallUrlAsync(string url, CancellationToken ct = default) + { + try + { + Stopwatch sw = Stopwatch.StartNew(); + using (var client = new HttpClient()) + { + HttpResponseMessage response = await client.GetAsync(url, ct); + response.EnsureSuccessStatusCode(); + + sw.Stop(); + baseUtils.TrackUrlCall(url, sw.Elapsed); + return await response.Content.ReadAsStringAsync(); + } + } + catch (OperationCanceledException) + { + return "Canceled"; + } + catch (Exception ex) + { + return $"Error: {ex.Message}"; + } + } + + /// + /// Effettua chiamata URL IMMEDIATAMENTE (GET) e restituisce risultato. + /// + public static string CallUrlGet(string url) + { + try + { + HttpClientHandler handler = new HttpClientHandler(); + if (url.Contains("10.74.82.")) + { + handler.ServerCertificateCustomValidationCallback = + HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; + } + + using (var client = new HttpClient(handler)) + { + Stopwatch sw = Stopwatch.StartNew(); + client.Timeout = TimeSpan.FromMilliseconds(5000); + client.DefaultRequestHeaders.UserAgent.ParseAdd(baseUtils.CRS("appName")); + + var response = client.GetAsync(url).Result; + string answ = response.Content.ReadAsStringAsync().Result; + + sw.Stop(); + baseUtils.TrackUrlCall(url, sw.Elapsed); + + return answ; + } + } + catch (Exception exc) + { + int pauseSendMSec = baseUtils.nextPauseSendMSec; + baseUtils.dtVetoSend = DateTime.Now.AddMilliseconds(pauseSendMSec); + + if (baseUtils.logValuePermit(url)) + { + baseUtils.lg.Error($"CallUrlGet | Errore chiamando {url} | wait {pauseSendMSec} ms{Environment.NewLine}Eccezione:{Environment.NewLine}{exc}"); + } + + return ""; + } + } + + /// + /// Effettua chiamata IMMEDIATAMENTE URL (POST) e restituisce risultato. + /// + public static string CallUrlPost(string url, string payload) + { + string answ = ""; + Stopwatch sw = Stopwatch.StartNew(); + + try + { + HttpClientHandler handler = new HttpClientHandler(); + if (url.Contains("10.74.")) + { + handler.ServerCertificateCustomValidationCallback = + HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; + } + + using (var client = new HttpClient(handler)) + { + client.Timeout = TimeSpan.FromMilliseconds(5000); + client.DefaultRequestHeaders.UserAgent.ParseAdd($"{baseUtils.CRS("appName")}-PAYLOAD"); + + var content = new StringContent(payload, Encoding.UTF8, "application/json"); + var response = client.PostAsync(url, content).Result; + + answ = response.Content.ReadAsStringAsync().Result; + + if (answ != "OK") + { + if (baseUtils.logValuePermit($"{url}|[{answ}]")) + { + baseUtils.lg.Error($"CallUrlPost | POST fallito | ans: [{answ}]:{Environment.NewLine}- URL{Environment.NewLine}{url}{Environment.NewLine}- payload{Environment.NewLine}{payload}"); + } + } + } + } + catch (Exception exc) + { + int pauseSendMSec = baseUtils.nextPauseSendMSec; + baseUtils.dtVetoSend = DateTime.Now.AddMilliseconds(pauseSendMSec); + + if (baseUtils.logValuePermit(url)) + { + baseUtils.lg.Error($"CallUrlPost | Errore chiamando {url} | wait {pauseSendMSec} ms | Dump Payload:{Environment.NewLine}{payload}{Environment.NewLine}Eccezione:{Environment.NewLine}{exc}"); + } + } + + sw.Stop(); + baseUtils.TrackUrlCall(url, sw.Elapsed); + return answ; + } + + /// + /// Effettua chiamata URL tramite RestSharp (GET) + /// + public static string ExecCallGet(string url, bool fastCall = false) + { + string answ = ""; + Uri uri = new Uri(url); + string baseUrl = $"{uri.Scheme}://{uri.Host}{(uri.IsDefaultPort ? "" : $":{uri.Port}")}"; + string resource = uri.AbsolutePath; + RestClientOptions restOptStd = new RestClientOptions + { + BaseUrl = new Uri(baseUrl), + Timeout = TimeSpan.FromSeconds(60) + }; + if (fastCall) restOptStd.Timeout = TimeSpan.FromSeconds(5); + + try + { + using (var client = new RestClient(restOptStd)) + { + var actReq = new RestRequest(resource, Method.Get); + var currResp = client.Get(actReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + answ = currResp.Content; + } + } + } + catch (Exception exc) + { + baseUtils.lg.Error($"Eccezione in ExecCallGet{Environment.NewLine}{exc}"); + } + return answ; + } + + /// + /// Effettua chiamata URL tramite RestSharp (POST JSON) + /// + public static string ExecCallPostJson(string url, string payload, bool fastCall = false) + { + string answ = ""; + Uri uri = new Uri(url); + string baseUrl = $"{uri.Scheme}://{uri.Host}{(uri.IsDefaultPort ? "" : $":{uri.Port}")}"; + string resource = uri.AbsolutePath; + RestClientOptions restOptStd = new RestClientOptions + { + BaseUrl = new Uri(baseUrl), + Timeout = TimeSpan.FromSeconds(60) + }; + if (fastCall) restOptStd.Timeout = TimeSpan.FromSeconds(5); + + Stopwatch sw = Stopwatch.StartNew(); + try + { + using (var client = new RestClient(restOptStd)) + { + var actReq = new RestRequest(resource, Method.Post); + actReq.AddJsonBody(payload); + var currResp = client.Post(actReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + answ = currResp.Content; + } + } + } + catch (Exception exc) + { + baseUtils.lg.Error($"Eccezione in ExecCallPostJson{Environment.NewLine}{exc}"); + } + sw.Stop(); + baseUtils.TrackUrlCall(url, sw.Elapsed); + return answ; + } + + /// + /// Effettua chiamata URL tramite RestSharp (POST Plain) + /// + public static string ExecCallPostPlain(string url, string payload, bool fastCall = false) + { + string answ = ""; + Uri uri = new Uri(url); + string baseUrl = $"{uri.Scheme}://{uri.Host}{(uri.IsDefaultPort ? "" : $":{uri.Port}")}"; + string resource = uri.AbsolutePath; + RestClientOptions restOptStd = new RestClientOptions + { + BaseUrl = new Uri(baseUrl), + Timeout = TimeSpan.FromSeconds(60) + }; + if (fastCall) restOptStd.Timeout = TimeSpan.FromSeconds(5); + + Stopwatch sw = Stopwatch.StartNew(); + try + { + using (var client = new RestClient(restOptStd)) + { + var actReq = new RestRequest(resource, Method.Post); + actReq.AddStringBody(payload, ContentType.Plain); + var currResp = client.Post(actReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + answ = currResp.Content; + } + } + } + catch (Exception exc) + { + baseUtils.lg.Error($"Eccezione in ExecCallPostPlain | rawUrl: {url} {Environment.NewLine}{exc}"); + } + sw.Stop(); + baseUtils.TrackUrlCall(url, sw.Elapsed); + return answ; + } + } +}