diff --git a/MP.Data/Services/IOC/IocService.cs b/MP.Data/Services/IOC/IocService.cs
index d3ad3c82..5acbe23a 100644
--- a/MP.Data/Services/IOC/IocService.cs
+++ b/MP.Data/Services/IOC/IocService.cs
@@ -117,7 +117,7 @@ namespace MP.Data.Services.IOC
result = await GetCurrOdlByProdAsync(idxMacchina);
_redisDb.StringSet(currKey, result, GetRandTOut(redisShortTimeCache));
}
- return result;
+ return result;
#endif
}
@@ -138,16 +138,37 @@ namespace MP.Data.Services.IOC
fetchFunc: async () =>
{
var rKey = MP.Data.Utils.RedKeyDatiMacc(idxMacchina, MpIoNS);
+ var val = await _redisDb.HashGetAsync(rKey, "insEnabled");
- string? val = await _redisDb.HashGetAsync(rKey, "insEnabled");
-
- if (val == null)
+ if (!val.HasValue)
{
var data = await ResetDatiMacchinaAsync(idxMacchina);
- data.TryGetValue("insEnabled", out val);
+ // 2. Uso del pattern matching per evitare allocazioni e passaggi intermedi
+ return data != null
+ && data.TryGetValue("insEnabled", out string? sVal)
+ && IsStringTrue(sVal);
}
- return val != null && (val == "1" || val.ToLower() == "true");
+ // 3. Conversione efficiente da RedisValue a string (evita l'interpolazione $"{val}")
+ string? sRedisVal = val;
+ return IsStringTrue(sRedisVal);
+
+#if false
+ var rKey = MP.Data.Utils.RedKeyDatiMacc(idxMacchina, MpIoNS);
+ var val = await _redisDb.HashGetAsync(rKey, "insEnabled");
+ string sVal = "";
+ if (!val.HasValue)
+ {
+ var data = await ResetDatiMacchinaAsync(idxMacchina);
+ data.TryGetValue("insEnabled", out sVal);
+ }
+ else
+ {
+ sVal = $"{val}";
+ }
+
+ return !string.IsNullOrEmpty(sVal) && (sVal == "1" || sVal.ToLower() == "true");
+#endif
},
expiration: GetRandTOut(30),
tagList: ["IOC_IobInsEnab", cKey, idxMacchina]
@@ -303,30 +324,14 @@ namespace MP.Data.Services.IOC
#endregion Protected Fields
-#if false
- ///
- /// Restituisce un timeout dai minuti richiesti + tempo random 1..60 sec
- ///
- ///
- ///
- protected TimeSpan GetRandTOut(double stdMinutes)
- {
- double rndValue = stdMinutes + (double)rand.Next(1, 60) / 60;
- return TimeSpan.FromMinutes(rndValue);
- }
-#endif
-
#region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger();
-#if false
- private readonly IFusionCache _cache;
-#endif
-
private readonly string _className;
private readonly IIocRepository _repo;
+
private readonly IServiceScopeFactory _scopeFactory;
///
@@ -341,14 +346,38 @@ namespace MP.Data.Services.IOC
#endregion Private Fields
+ #region Private Methods
+
+ private static bool IsStringTrue(string? value)
+ {
+ if (string.IsNullOrEmpty(value)) return false;
+
+ // Evita ToLower() che alloca una nuova stringa in memoria ad ogni chiamata
+ return value == "1"
+ || value.Equals("true", StringComparison.OrdinalIgnoreCase);
+ }
+
+#if false
+ ///
+ /// Restituisce un timeout dai minuti richiesti + tempo random 1..60 sec
+ ///
+ ///
+ ///
+ protected TimeSpan GetRandTOut(double stdMinutes)
+ {
+ double rndValue = stdMinutes + (double)rand.Next(1, 60) / 60;
+ return TimeSpan.FromMinutes(rndValue);
+ }
+#endif
+#if false
+ private readonly IFusionCache _cache;
+#endif
#if false
private int redisLongTimeCache = 5;
private int redisShortTimeCache = 2;
#endif
- #region Private Methods
-
///
/// controlla se da il segnale di "microstato" deriva un evento da generare - modalità OFFLINE
///
@@ -1070,7 +1099,7 @@ namespace MP.Data.Services.IOC
{
result = new StatoProdModel();
}
- return result;
+ return result;
#endif
return await _repo.StatoProdMacchinaAsync(idxMacchina, dtReq);
},
diff --git a/MP.IOC/Controllers/IOBController.cs b/MP.IOC/Controllers/IOBController.cs
index 1cb8570f..a7e29794 100644
--- a/MP.IOC/Controllers/IOBController.cs
+++ b/MP.IOC/Controllers/IOBController.cs
@@ -75,39 +75,42 @@ namespace MP.IOC.Controllers
return Ok(answ);
}
- /////
- ///// GET: IOB/
- /////
- /////
- //[HttpGet]
- //public string Alive()
- //{
- // return "OK"; // Restituisce Status 200
- //}
-
///
/// GET: IOB/enabled/SIMUL_03
///
///
///
[HttpGet("enabled/{id}")]
- public async Task Enabled(string id)
+ public async Task Enabled(string id)
{
- if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID");
+ if (string.IsNullOrWhiteSpace(id))
+ {
+ Response.StatusCode = StatusCodes.Status400BadRequest;
+ return "Missing ID";
+ //return BadRequest("Missing ID");
+ }
try
{
// Il metodo ora restituisce direttamente il booleano logico
bool isEnabled = await IOCService.IobInsEnabAsync(id);
- return isEnabled
- ? Ok("OK")
- : UnprocessableEntity("NO");
+ // Eliminazione delle allocazioni di stringhe e oggetti inutili
+ if (!isEnabled)
+ {
+ Response.StatusCode = StatusCodes.Status422UnprocessableEntity;
+ return "NO";
+ }
+
+ // Status 200 di default, scrive direttamente sul body della response
+ return "OK";
}
catch (Exception ex)
{
Log.Error(ex, "Errore durante la verifica abilitazione per {Id}", id);
- return StatusCode(500, "Errore interno del server");
+ Response.StatusCode = StatusCodes.Status500InternalServerError;
+ return "Errore interno del server";
+ //return StatusCode(500, "Errore interno del server");
}
}
diff --git a/MP.IOC/appsettings.json b/MP.IOC/appsettings.json
index e947a8ce..c70d3442 100644
--- a/MP.IOC/appsettings.json
+++ b/MP.IOC/appsettings.json
@@ -6,7 +6,8 @@
"Microsoft.EntityFrameworkCore.Database.Command": "Warning",
"Microsoft.EntityFrameworkCore.Infrastructure": "Warning",
"Microsoft.WebTools.BrowserLink.Net.BrowserLinkMiddleware": "None",
- "Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware": "None"
+ "Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware": "None",
+ "ZiggyCreatures.Caching.Fusion": "Warning"
}
},
"NLog": {