diff --git a/MP-TAB3/MP-TAB3.csproj b/MP-TAB3/MP-TAB3.csproj
index 65364cf6..1a5cd375 100644
--- a/MP-TAB3/MP-TAB3.csproj
+++ b/MP-TAB3/MP-TAB3.csproj
@@ -3,7 +3,7 @@
net8.0
enable
- 8.16.2606.1312
+ 8.16.2606.2012
enable
MP_TAB3
diff --git a/MP-TAB3/Resources/ChangeLog.html b/MP-TAB3/Resources/ChangeLog.html
index b09252cc..31f8f6da 100644
--- a/MP-TAB3/Resources/ChangeLog.html
+++ b/MP-TAB3/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MAPOSPEC
- Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2012
Note di rilascio:
-
diff --git a/MP-TAB3/Resources/VersNum.txt b/MP-TAB3/Resources/VersNum.txt
index 84233792..4e825518 100644
--- a/MP-TAB3/Resources/VersNum.txt
+++ b/MP-TAB3/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2012
diff --git a/MP-TAB3/Resources/manifest.xml b/MP-TAB3/Resources/manifest.xml
index 4896b650..e7b9c0c8 100644
--- a/MP-TAB3/Resources/manifest.xml
+++ b/MP-TAB3/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2012
https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/MP-TAB3.zip
https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/ChangeLog.html
false
diff --git a/MP.Data/DataServiceCollectionExtensions.cs b/MP.Data/DataServiceCollectionExtensions.cs
index 03a1f181..917d08de 100644
--- a/MP.Data/DataServiceCollectionExtensions.cs
+++ b/MP.Data/DataServiceCollectionExtensions.cs
@@ -55,6 +55,25 @@ namespace MP.Data
return services;
}
+ ///
+ /// Aggiunta repository/servizi specifici per RIOC
+ ///
+ ///
+ ///
+ public static IServiceCollection AddRIocDataLayer(this IServiceCollection services)
+ {
+
+ // Repository Scoped x registrazione statistiche chiamate
+ services.TryAddScoped();
+ services.TryAddScoped();
+
+ // Servizi Scoped statistiche
+ services.TryAddScoped();
+ services.TryAddScoped();
+
+ return services;
+ }
+
///
/// Aggiunta repository/servizi specifici per LAND
///
diff --git a/MP.INVE/MP.INVE.csproj b/MP.INVE/MP.INVE.csproj
index 6a3e6044..d9c4e74b 100644
--- a/MP.INVE/MP.INVE.csproj
+++ b/MP.INVE/MP.INVE.csproj
@@ -5,7 +5,7 @@
enable
enable
MP.INVE
- 8.16.2606.1312
+ 8.16.2606.2012
diff --git a/MP.INVE/Resources/ChangeLog.html b/MP.INVE/Resources/ChangeLog.html
index 4a399a9e..2d92031d 100644
--- a/MP.INVE/Resources/ChangeLog.html
+++ b/MP.INVE/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MAPOINVE
-
Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2012
Note di rilascio:
-
diff --git a/MP.INVE/Resources/VersNum.txt b/MP.INVE/Resources/VersNum.txt
index 84233792..4e825518 100644
--- a/MP.INVE/Resources/VersNum.txt
+++ b/MP.INVE/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2012
diff --git a/MP.INVE/Resources/manifest.xml b/MP.INVE/Resources/manifest.xml
index d7fa5553..a85f15ae 100644
--- a/MP.INVE/Resources/manifest.xml
+++ b/MP.INVE/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2012
https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/MP.INVE.zip
https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/ChangeLog.html
false
diff --git a/MP.IOC/MP.IOC.csproj b/MP.IOC/MP.IOC.csproj
index 746511b7..08ae3f75 100644
--- a/MP.IOC/MP.IOC.csproj
+++ b/MP.IOC/MP.IOC.csproj
@@ -4,7 +4,7 @@
net8.0
enable
enable
- 8.16.2606.2010
+ 8.16.2606.2013
diff --git a/MP.IOC/Program.cs b/MP.IOC/Program.cs
index 376940a2..248374be 100644
--- a/MP.IOC/Program.cs
+++ b/MP.IOC/Program.cs
@@ -107,8 +107,8 @@ builder.Services.AddSingleton();
// 1. Registra il serializzatore NewtonsoftJson per FusionCache
builder.Services.AddSingleton(new FusionCacheNewtonsoftJsonSerializer());
-
// 2. Configura FusionCache (L1 Memory + L2 Redis Distributed + L3 DB via factory)
+//builder.Services.AddFusionCache("MAPO_MES_FusionCache")
builder.Services.AddFusionCache()
.WithDistributedCache(sp => sp.GetRequiredService())
.WithSerializer(new FusionCacheNewtonsoftJsonSerializer())
@@ -119,11 +119,17 @@ builder.Services.AddFusionCache()
.WithDefaultEntryOptions(options =>
{
// Durata di default dei dati in memoria
- options.Duration = TimeSpan.FromMinutes(1);
+ options.Duration = TimeSpan.FromMinutes(5);
// Jitter: variazione casuale alla scadenza per evitare scadenze in blocco
options.JitterMaxDuration = TimeSpan.FromSeconds(5);
});
+//// 3. LA RIGA MAGICA: Estrae l'istanza nominata e la mappa come IFusionCache standard
+//builder.Services.AddSingleton(sp =>
+// sp.GetRequiredService().GetCache("MAPO_MES_FusionCache"));
+
+// aggiunta http client x chiamare REST esterne (reset cache su RIOC, in attesa fix fusionCache)
+builder.Services.AddHttpClient();
logger.Info("Standard service configured");
diff --git a/MP.IOC/Resources/ChangeLog.html b/MP.IOC/Resources/ChangeLog.html
index 05636903..d0fe27de 100644
--- a/MP.IOC/Resources/ChangeLog.html
+++ b/MP.IOC/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MP-IOC
-
Versione: 8.16.2606.2010
+ Versione: 8.16.2606.2013
Note di rilascio:
-
diff --git a/MP.IOC/Resources/VersNum.txt b/MP.IOC/Resources/VersNum.txt
index eb7b715b..e8c8b0bf 100644
--- a/MP.IOC/Resources/VersNum.txt
+++ b/MP.IOC/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.2010
+8.16.2606.2013
diff --git a/MP.IOC/Resources/manifest.xml b/MP.IOC/Resources/manifest.xml
index 7436d253..f159aea0 100644
--- a/MP.IOC/Resources/manifest.xml
+++ b/MP.IOC/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.2010
+ 8.16.2606.2013
https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/MP.IOC.zip
https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/ChangeLog.html
false
diff --git a/MP.IOC/Services/IWeightProvider.cs b/MP.IOC/Services/IWeightProvider.cs
index df2c4fa0..a2fc5a6c 100644
--- a/MP.IOC/Services/IWeightProvider.cs
+++ b/MP.IOC/Services/IWeightProvider.cs
@@ -12,10 +12,12 @@ namespace MP.IOC.Services
///
Task
> GetAllWeightsAsync();
+#if false
///
/// Ritorna la coppia (oldWeight, newWeight) per scegliere dove instradare il metodo tra i 2 sistemi API.
///
- (int oldWeight, int newWeight) GetWeightsFor(string method);
+ (int oldWeight, int newWeight) GetWeightsFor(string method);
+#endif
///
/// Aggiorna/Aggiuinge il valore del weight richiesto
diff --git a/MP.IOC/Services/InMemoryWeightProvider.cs b/MP.IOC/Services/InMemoryWeightProvider.cs
index d6885e51..30ebd212 100644
--- a/MP.IOC/Services/InMemoryWeightProvider.cs
+++ b/MP.IOC/Services/InMemoryWeightProvider.cs
@@ -16,11 +16,13 @@ namespace MP.IOC.Services
_defaultNew = config.GetValue("RouteMan:DefaultWeightNew", 0);
}
+#if false
public (int oldWeight, int newWeight) GetWeightsFor(string method)
{
if (string.IsNullOrEmpty(method)) method = "unknown";
return _map.GetOrAdd(method, _ => (_defaultOld, _defaultNew));
- }
+ }
+#endif
public void SetWeights(string method, int oldWeight, int newWeight)
{
diff --git a/MP.IOC/Services/RedisWeightProvider.cs b/MP.IOC/Services/RedisWeightProvider.cs
index 9daf4113..1a4f8f5e 100644
--- a/MP.IOC/Services/RedisWeightProvider.cs
+++ b/MP.IOC/Services/RedisWeightProvider.cs
@@ -1,5 +1,7 @@
using MP.Core.DTO;
+using NLog;
using StackExchange.Redis;
+using ZiggyCreatures.Caching.Fusion;
namespace MP.IOC.Services
{
@@ -7,14 +9,23 @@ namespace MP.IOC.Services
{
#region Public Constructors
- public RedisWeightProvider(IConnectionMultiplexer mux, IConfiguration config)
+ public RedisWeightProvider(
+ IConnectionMultiplexer mux,
+ IFusionCache cache,
+ IHttpClientFactory httpClientFactory,
+ IConfiguration config)
{
+ _cache = cache;
_config = config;
+ _httpClientFactory = httpClientFactory;
_db = mux.GetDatabase();
_mux = mux;
_defaultOld = config.GetValue("RouteMan:DefaultWeightOld", 100);
_defaultNew = config.GetValue("RouteMan:DefaultWeightNew", 0);
_redisBaseKey = config.GetValue("ServerConf:RedisBaseKey") ?? "MP_IOC";
+ // Leggiamo l'URL base del gateway dal file di configurazione dell'Admin
+ // es. "https://10.74.83.100:5290/MP/RIOC/api/admin/cache/purge-route/"
+ _gatewayPurgeUrl = config.GetValue("ServerConf:GatewayPurgeUrl") ?? "https://localhost:7120/MP/RIOC/api/admin/cache/purge-route/";
_keyPrefix = $"{_redisBaseKey}:route_weight:";
}
@@ -22,6 +33,140 @@ namespace MP.IOC.Services
#region Public Methods
+ public async Task> GetAllWeightsAsync()
+ {
+ var result = new List();
+ var server = _mux.GetServer(_mux.GetEndPoints().First());
+
+ if (server.IsReplica)
+ {
+ return result;
+ }
+
+ await foreach (var key in server.KeysAsync(pattern: $"{_keyPrefix}*"))
+ {
+ var methodName = KeyToString(key.ToString());
+ if (string.IsNullOrEmpty(methodName)) continue;
+
+ var oldVal = _db.HashGet(key, "old");
+ var newVal = _db.HashGet(key, "new");
+
+ int oldW = 100;
+ int newW = 0;
+
+ if (!oldVal.IsNull && int.TryParse(oldVal.ToString(), out var parsedOld))
+ oldW = Math.Clamp(parsedOld, 0, 100);
+
+ if (!newVal.IsNull && int.TryParse(newVal.ToString(), out var parsedNew))
+ newW = Math.Clamp(parsedNew, 0, 100);
+
+ result.Add(new WeightDTO { Method = methodName, OldWeight = oldW, NewWeight = newW });
+ }
+
+ // riordino desc x NEW poi alfabetico...
+ result = result
+ .OrderByDescending(x => x.NewWeight)
+ .ThenBy(x => x.Method)
+ .ToList();
+
+ return result;
+ }
+
+ // API per aggiornare i pesi a runtime (opzionale)
+ public void SetWeights(string method, int oldWeight, int newWeight)
+ {
+ var key = _keyPrefix + (string.IsNullOrEmpty(method) ? "unknown" : method);
+ _db.HashSet(key, new HashEntry[] {
+ new HashEntry("old", Math.Clamp(oldWeight,0,100)),
+ new HashEntry("new", Math.Clamp(newWeight,0,100))
+ });
+
+ ResetFusionCache(method);
+ }
+
+ public bool UpsertWeight(WeightDTO updRecord)
+ {
+ if (updRecord == null || string.IsNullOrEmpty(updRecord.Method))
+ return false;
+
+ // 1. Scrivi su Redis (Sorgente dati reale)
+ var key = _keyPrefix + updRecord.Method;
+ _db.HashSet(key, new HashEntry[] {
+ new HashEntry("old", Math.Clamp(updRecord.OldWeight, 0, 100)),
+ new HashEntry("new", Math.Clamp(updRecord.NewWeight, 0, 100))
+ });
+
+ ResetFusionCache(updRecord.Method);
+
+ return true;
+ }
+
+ #endregion Public Methods
+
+ #region Private Fields
+
+ private static string _keyPrefix = "route_weight:";
+ private static string _redisBaseKey = "";
+ private static Logger Log = LogManager.GetCurrentClassLogger();
+ private readonly IFusionCache _cache;
+ private readonly IConfiguration _config;
+ private readonly IDatabase _db;
+ private readonly int _defaultNew;
+ private readonly int _defaultOld;
+ private readonly string _gatewayPurgeUrl;
+ private readonly IHttpClientFactory _httpClientFactory;
+ private readonly IConnectionMultiplexer _mux;
+
+ #endregion Private Fields
+
+ #region Private Methods
+
+ private string KeyToString(string key)
+ {
+ if (string.IsNullOrEmpty(key)) return "";
+ var prefix = _keyPrefix ?? "";
+ if (key.StartsWith(prefix))
+ return key.Substring(prefix.Length);
+ return key;
+ }
+
+ private void ResetFusionCache(string method)
+ {
+ //try
+ //{
+ // // Sfrutta la factory per prendere un client ottimizzato e pulito
+ // using var client = _httpClientFactory.CreateClient();
+
+ // // Componiamo l'URL finale pulito (es. .../purge-route/SIMUL_01)
+ // var finalUrl = $"{_gatewayPurgeUrl.TrimEnd('/')}/{updRecord.Method}";
+
+ // // Inviamo la POST (passiamo null come HttpContent perché non serve un Body)
+ // var response = client.PostAsync(finalUrl, null);
+
+ // if (response.IsSuccessStatusCode)
+ // {
+ // Log.Info($"[CACHE] Sfratto RAM notificato con successo al Gateway per il metodo: {updRecord.Method}");
+ // }
+ // else
+ // {
+ // Log.Warn($"[CACHE] Il gateway ha risposto con codice {response.StatusCode} alla purga di {updRecord.Method}");
+ // }
+ //}
+ //catch (Exception ex)
+ //{
+ // // Usiamo un log di errore ma non blocchiamo l'applicazione Admin
+ // // se il gateway in quel momento fosse offline o irraggiungibile
+ // Log.Error(ex, $"[CACHE] Impossibile raggiungere il gateway per spurgare la rotta: {updRecord.Method}");
+ //}
+
+ // Grazie al Backplane Pub/Sub, la RAM verrà azzerata istantaneamente su TUTTI i server.
+ var cacheKey = $"weights:{method}";
+ _cache.Remove(cacheKey);
+ }
+
+ #endregion Private Methods
+
+#if false
///
/// Ritorna (oldWeight, newWeight) per il metodo. Se non esiste, crea la chiave con i default.
///
@@ -67,91 +212,6 @@ namespace MP.IOC.Services
return (oldW, newW);
}
-
- // API per aggiornare i pesi a runtime (opzionale)
- public void SetWeights(string method, int oldWeight, int newWeight)
- {
- var key = _keyPrefix + (string.IsNullOrEmpty(method) ? "unknown" : method);
- _db.HashSet(key, new HashEntry[] {
- new HashEntry("old", Math.Clamp(oldWeight,0,100)),
- new HashEntry("new", Math.Clamp(newWeight,0,100))
- });
- }
-
- public async Task> GetAllWeightsAsync()
- {
- var result = new List();
- var server = _mux.GetServer(_mux.GetEndPoints().First());
-
- if (server.IsReplica)
- {
- return result;
- }
-
- await foreach (var key in server.KeysAsync(pattern: $"{_keyPrefix}*"))
- {
- var methodName = KeyToString(key.ToString());
- if (string.IsNullOrEmpty(methodName)) continue;
-
- var oldVal = _db.HashGet(key, "old");
- var newVal = _db.HashGet(key, "new");
-
- int oldW = 100;
- int newW = 0;
-
- if (!oldVal.IsNull && int.TryParse(oldVal.ToString(), out var parsedOld))
- oldW = Math.Clamp(parsedOld, 0, 100);
-
- if (!newVal.IsNull && int.TryParse(newVal.ToString(), out var parsedNew))
- newW = Math.Clamp(parsedNew, 0, 100);
-
- result.Add(new WeightDTO { Method = methodName, OldWeight = oldW, NewWeight = newW });
- }
-
- // riordino desc x NEW poi alfabetico...
- result = result
- .OrderByDescending(x => x.NewWeight)
- .ThenBy(x => x.Method)
- .ToList();
-
- return result;
- }
-
- public bool UpsertWeight(WeightDTO updRecord)
- {
- if (updRecord == null || string.IsNullOrEmpty(updRecord.Method))
- return false;
-
- var key = _keyPrefix + updRecord.Method;
- _db.HashSet(key, new HashEntry[] {
- new HashEntry("old", Math.Clamp(updRecord.OldWeight, 0, 100)),
- new HashEntry("new", Math.Clamp(updRecord.NewWeight, 0, 100))
- });
-
- return true;
- }
-
- private string KeyToString(string key)
- {
- if (string.IsNullOrEmpty(key)) return "";
- var prefix = _keyPrefix ?? "";
- if (key.StartsWith(prefix))
- return key.Substring(prefix.Length);
- return key;
- }
-
- #endregion Public Methods
-
- #region Private Fields
-
- private static string _keyPrefix = "route_weight:";
- private static string _redisBaseKey = "";
- private readonly IConfiguration _config;
- private readonly IDatabase _db;
- private readonly IConnectionMultiplexer _mux;
- private readonly int _defaultNew;
- private readonly int _defaultOld;
-
- #endregion Private Fields
+#endif
}
}
\ No newline at end of file
diff --git a/MP.IOC/appsettings.Production.json b/MP.IOC/appsettings.Production.json
index 787c7891..024c3541 100644
--- a/MP.IOC/appsettings.Production.json
+++ b/MP.IOC/appsettings.Production.json
@@ -16,6 +16,7 @@
"mdbConnString": "mongodb://localhost:27017"
},
"ServerConf": {
+ "GatewayPurgeUrl": "http://maposrv.egalware.com/MP/RIOC/api/admin/cache/purge-route/",
"useFactory": false
}
}
diff --git a/MP.IOC/appsettings.json b/MP.IOC/appsettings.json
index 4bd6bf3c..5edfaad4 100644
--- a/MP.IOC/appsettings.json
+++ b/MP.IOC/appsettings.json
@@ -64,6 +64,7 @@
},
"ServerConf": {
"BaseUrlIoc": "/MP/IOC/",
+ "GatewayPurgeUrl": "http://iis01.egalware.com/MP/RIOC/api/admin/cache/purge-route/",
"MpIoNS": "MoonPro:SQL2016DEV:MoonPro",
"RedisBaseKey": "MP-IOC",
"RedisWeight": true,
diff --git a/MP.Land/MP.Land.csproj b/MP.Land/MP.Land.csproj
index f8824d6e..999ee601 100644
--- a/MP.Land/MP.Land.csproj
+++ b/MP.Land/MP.Land.csproj
@@ -3,7 +3,7 @@
net8.0
MP.Land
- 8.16.2606.1312
+ 8.16.2606.2012
Debug;Release;Debug_LiManDebug
en
True
diff --git a/MP.Land/Resources/ChangeLog.html b/MP.Land/Resources/ChangeLog.html
index 7e4dedb9..0f0ffcf8 100644
--- a/MP.Land/Resources/ChangeLog.html
+++ b/MP.Land/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo Tablet MAPO - DotNet6
- Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2012
Note di rilascio:
diff --git a/MP.Land/Resources/VersNum.txt b/MP.Land/Resources/VersNum.txt
index 84233792..4e825518 100644
--- a/MP.Land/Resources/VersNum.txt
+++ b/MP.Land/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2012
diff --git a/MP.Land/Resources/manifest.xml b/MP.Land/Resources/manifest.xml
index ed12ccf8..4bc1337a 100644
--- a/MP.Land/Resources/manifest.xml
+++ b/MP.Land/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2012
https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/MP.Land.zip
https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/ChangeLog.html
false
diff --git a/MP.MON/MP.MON.csproj b/MP.MON/MP.MON.csproj
index ba22459c..3c3053a2 100644
--- a/MP.MON/MP.MON.csproj
+++ b/MP.MON/MP.MON.csproj
@@ -6,7 +6,7 @@
enable
MP.MON
$(AssemblyName.Replace(' ', '_'))
- 8.16.2606.1312
+ 8.16.2606.2012
diff --git a/MP.MON/Resources/ChangeLog.html b/MP.MON/Resources/ChangeLog.html
index b09252cc..31f8f6da 100644
--- a/MP.MON/Resources/ChangeLog.html
+++ b/MP.MON/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MAPOSPEC
- Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2012
Note di rilascio:
-
diff --git a/MP.MON/Resources/VersNum.txt b/MP.MON/Resources/VersNum.txt
index 84233792..4e825518 100644
--- a/MP.MON/Resources/VersNum.txt
+++ b/MP.MON/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2012
diff --git a/MP.MON/Resources/manifest.xml b/MP.MON/Resources/manifest.xml
index 07216334..3a49dd82 100644
--- a/MP.MON/Resources/manifest.xml
+++ b/MP.MON/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2012
https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/MP.MON.zip
https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/ChangeLog.html
false
diff --git a/MP.Prog/MP.Prog.csproj b/MP.Prog/MP.Prog.csproj
index 50d58df9..cb7f9547 100644
--- a/MP.Prog/MP.Prog.csproj
+++ b/MP.Prog/MP.Prog.csproj
@@ -3,7 +3,7 @@
net8.0
MP.Prog
- 8.16.2606.1312
+ 8.16.2606.2012
True
diff --git a/MP.Prog/Resources/ChangeLog.html b/MP.Prog/Resources/ChangeLog.html
index 589576a7..641e1d09 100644
--- a/MP.Prog/Resources/ChangeLog.html
+++ b/MP.Prog/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo gestione Programmi MAPO
-
Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2012
Note di rilascio:
diff --git a/MP.Prog/Resources/VersNum.txt b/MP.Prog/Resources/VersNum.txt
index 84233792..4e825518 100644
--- a/MP.Prog/Resources/VersNum.txt
+++ b/MP.Prog/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2012
diff --git a/MP.Prog/Resources/manifest.xml b/MP.Prog/Resources/manifest.xml
index 2faec268..b61c7dc3 100644
--- a/MP.Prog/Resources/manifest.xml
+++ b/MP.Prog/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2012
https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/MP.Prog.zip
https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/ChangeLog.html
false
diff --git a/MP.RIOC/MP.RIOC.csproj b/MP.RIOC/MP.RIOC.csproj
index d43f29e2..1d28b455 100644
--- a/MP.RIOC/MP.RIOC.csproj
+++ b/MP.RIOC/MP.RIOC.csproj
@@ -5,7 +5,7 @@
enable
enable
MP.RIOC
- 8.16.2606.1312
+ 8.16.2606.2013
InProcess
diff --git a/MP.RIOC/Program.cs b/MP.RIOC/Program.cs
index a1f35daf..c47c8b8f 100644
--- a/MP.RIOC/Program.cs
+++ b/MP.RIOC/Program.cs
@@ -1,5 +1,5 @@
using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Diagnostics;
+using Microsoft.Extensions.Caching.Distributed;
using MP.Core.Conf;
using MP.Data;
using MP.RIOC.Services;
@@ -9,6 +9,10 @@ using StackExchange.Redis;
using System.Diagnostics;
using System.Net;
using System.Reflection;
+using ZiggyCreatures.Caching.Fusion;
+using ZiggyCreatures.Caching.Fusion.Backplane.StackExchangeRedis;
+using ZiggyCreatures.Caching.Fusion.Serialization;
+using ZiggyCreatures.Caching.Fusion.Serialization.NewtonsoftJson;
// Forza il ThreadPool a tenere pronti almeno 500 thread per i calcoli e 500 per l'I/O di rete
@@ -19,6 +23,11 @@ var builder = WebApplication.CreateBuilder(args);
// RECUPERO L'AMBIENTE REALE (Che ora IIS passa correttamente come 'Staging')
var env = builder.Environment;
+// recupero env corrente
+var logger = LogManager.Setup()
+ .LoadConfigurationFromAppSettings()
+ .GetCurrentClassLogger();
+
// FORZA IL CARICAMENTO CORRETTO DEI JSON CON LA GERARCHIA DI AMBIENTE
builder.Configuration
.SetBasePath(env.ContentRootPath)
@@ -26,10 +35,6 @@ builder.Configuration
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
-// recupero env corrente
-var logger = LogManager.Setup()
- .LoadConfigurationFromAppSettings()
- .GetCurrentClassLogger();
builder.Logging.ClearProviders();
builder.Host.UseNLog();
@@ -50,29 +55,14 @@ builder.Services.Configure(
builder.Configuration.GetSection("RedisScripts"));
logger.Info("RedisScript Provider configured");
-// Metodi principali x accesso dati
-var connStr = builder.Configuration.GetConnectionString("MP.Data")
- ?? throw new InvalidOperationException("ConnString 'MP.Data' mancante.");
-builder.Services.AddDbContextFactory(options =>
- options.UseSqlServer(connStr)
- .EnableSensitiveDataLogging(false) // true solo in Sviluppo
- .ConfigureWarnings(w => w.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning)));
-var connStrFL = builder.Configuration.GetConnectionString("MP.Flux")
- ?? throw new InvalidOperationException("ConnString 'MP.Flux' mancante.");
-builder.Services.AddDbContextFactory(options =>
- options.UseSqlServer(connStrFL)
- .EnableSensitiveDataLogging(false) // true solo in Sviluppo
- .ConfigureWarnings(w => w.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning)));
-
// MP.Data DbContext for Stats repositories
string utilsConnString = builder.Configuration.GetConnectionString("MP.Utils") ?? "Server=localhost;Database=MoonPro_Utils; integrated security=True; MultipleActiveResultSets=True; App=MP.IOC;";
builder.Services.AddDbContextFactory(options =>
options.UseSqlServer(utilsConnString));
// MP.Data Services Utils - Statistiche DB
-builder.Services.AddIocDataLayer();
+builder.Services.AddRIocDataLayer();
-// 1. Configurazione dell'invoker personalizzato (Risolve i tuoi errori)
// 1. Configurazione dell'invoker personalizzato (Potenziato con il Pooling)
var httpClientInvoker = new HttpMessageInvoker(new SocketsHttpHandler
{
@@ -109,8 +99,28 @@ builder.Services.AddHttpForwarder();
var redisMux = ConnectionMultiplexer.Connect(confRedis);
builder.Services.AddSingleton(redisMux);
-// registrazione FusionCache
-builder.Services.AddFusionCache();
+// 1. Registra il serializzatore NewtonsoftJson per FusionCache
+builder.Services.AddSingleton(new FusionCacheNewtonsoftJsonSerializer());
+// 2. Configura FusionCache (L1 Memory + L2 Redis Distributed + L3 DB via factory)
+//builder.Services.AddFusionCache("MAPO_MES_FusionCache")
+builder.Services.AddFusionCache()
+ .WithDistributedCache(sp => sp.GetRequiredService())
+ .WithSerializer(new FusionCacheNewtonsoftJsonSerializer())
+ .WithBackplane(new RedisBackplane(new RedisBackplaneOptions
+ {
+ ConnectionMultiplexerFactory = () => Task.FromResult(redisMux)
+ }))
+ .WithDefaultEntryOptions(options =>
+ {
+ // Durata di default dei dati in memoria
+ options.Duration = TimeSpan.FromMinutes(5);
+
+ // Jitter: variazione casuale alla scadenza per evitare scadenze in blocco
+ options.JitterMaxDuration = TimeSpan.FromSeconds(5);
+ });
+//// 3. LA RIGA MAGICA: Estrae l'istanza nominata e la mappa come IFusionCache standard
+//builder.Services.AddSingleton(sp =>
+// sp.GetRequiredService().GetCache("MAPO_MES_FusionCache"));
// Registrazione dei servizi custom
builder.Services.AddSingleton();
@@ -175,6 +185,38 @@ app.Use(async (ctx, next) =>
await next();
});
+
+// test per ambiente di esecuzione InProcess...
+app.MapGet("api/alive", () =>
+ $"OK - Girando in: {System.Diagnostics.Process.GetCurrentProcess().ProcessName}");
+
+app.MapGet("/router-status", (RouteStatsManager stats) => Results.Ok(new
+{
+ Status = "Online",
+ Version = assemblyVersion,
+ Mode = weightOnRedis ? "Redis" : "InMemory",
+ Time = DateTime.Now,
+ Metrics = stats.Snapshot()
+}));
+
+// Endpoint per la rimozione mirata di una singola rotta dalla cache
+app.MapPost("/api/admin/cache/purge-route/{method}", (string method, IWeightProvider weightProvider) =>
+{
+ try
+ {
+ if (weightProvider is RedisWeightProvider redisProvider)
+ {
+ redisProvider.EvictLocalCacheFor(method);
+ return Results.Ok(new { Success = true, Message = $"Cache RAM per '{method}' svuotata." });
+ }
+ return Results.Problem("Provider non valido.");
+ }
+ catch (Exception ex)
+ {
+ return Results.Problem($"Errore: {ex.Message}");
+ }
+});
+
// 5. Il cuore del Proxy (MapWhen è terminale per le richieste che lo soddisfano)
string routePath = configuration.GetValue("ServerConf:RoutePath") ?? "/api/IOB";
string fullPath = $"{baseUrl}{routePath}".Replace("//", "/");
@@ -189,22 +231,10 @@ app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments(routePath, StringComparis
});
});
-// test per ambiente di esecuzione InProcess...
-app.MapGet("api/alive", () =>
- $"OK - Girando in: {System.Diagnostics.Process.GetCurrentProcess().ProcessName}");
// 6. Definizione degli Endpoints locali
app.MapRazorPages();
-app.MapGet("/router-status", (RouteStatsManager stats) => Results.Ok(new
-{
- Status = "Online",
- Version = assemblyVersion,
- Mode = weightOnRedis ? "Redis" : "InMemory",
- Time = DateTime.Now,
- Metrics = stats.Snapshot()
-}));
-
// 7. Fallback "intelligente"
// Invece di app.Run, usiamo MapFallback che viene eseguito SOLO se nessun altro endpoint o MapWhen ha risposto
app.MapFallback(async context =>
diff --git a/MP.RIOC/Properties/launchSettings.json b/MP.RIOC/Properties/launchSettings.json
index b57a323d..6d9aebb6 100644
--- a/MP.RIOC/Properties/launchSettings.json
+++ b/MP.RIOC/Properties/launchSettings.json
@@ -14,7 +14,7 @@
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "MP/RIOC/api/IOB/",
- "applicationUrl": "http://localhost:5290",
+ "applicationUrl": "http://*:5290",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
@@ -24,7 +24,7 @@
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "MP/RIOC/api/IOB/",
- "applicationUrl": "https://localhost:7120;http://localhost:5290",
+ "applicationUrl": "https://*:7120;http://*:5290",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
diff --git a/MP.RIOC/Resources/ChangeLog.html b/MP.RIOC/Resources/ChangeLog.html
index ca5bc7eb..dde49877 100644
--- a/MP.RIOC/Resources/ChangeLog.html
+++ b/MP.RIOC/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MP-RIOC
-
Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2013
Note di rilascio:
-
diff --git a/MP.RIOC/Resources/VersNum.txt b/MP.RIOC/Resources/VersNum.txt
index 84233792..e8c8b0bf 100644
--- a/MP.RIOC/Resources/VersNum.txt
+++ b/MP.RIOC/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2013
diff --git a/MP.RIOC/Resources/manifest.xml b/MP.RIOC/Resources/manifest.xml
index fd40f4f9..82e3f4dd 100644
--- a/MP.RIOC/Resources/manifest.xml
+++ b/MP.RIOC/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2013
https://nexus.steamware.net/repository/SWS/MP-RIOC/stable/LAST/MP.RIOC.zip
https://nexus.steamware.net/repository/SWS/MP-RIOC/stable/LAST/ChangeLog.html
false
diff --git a/MP.RIOC/Services/RedisWeightProvider.cs b/MP.RIOC/Services/RedisWeightProvider.cs
index e003c8e5..4b313397 100644
--- a/MP.RIOC/Services/RedisWeightProvider.cs
+++ b/MP.RIOC/Services/RedisWeightProvider.cs
@@ -1,5 +1,6 @@
using MP.Core.DTO;
using StackExchange.Redis;
+using ZiggyCreatures.Caching.Fusion;
namespace MP.RIOC.Services
{
@@ -7,8 +8,12 @@ namespace MP.RIOC.Services
{
#region Public Constructors
- public RedisWeightProvider(IConnectionMultiplexer mux, IConfiguration config)
+ public RedisWeightProvider(
+ IConnectionMultiplexer mux,
+ IFusionCache cache,
+ IConfiguration config)
{
+ _cache = cache;
_config = config;
_db = mux.GetDatabase();
_mux = mux;
@@ -23,59 +28,17 @@ namespace MP.RIOC.Services
#region Public Methods
///
- /// Ritorna (oldWeight, newWeight) per il metodo. Se non esiste, crea la chiave con i default.
+ /// Eliminazione esplicita cache data chiave
///
- public (int oldWeight, int newWeight) GetWeightsFor(string method)
+ ///
+ public void EvictLocalCacheFor(string method)
{
- if (string.IsNullOrEmpty(method)) method = "unknown";
- var key = _keyPrefix + method;
+ if (string.IsNullOrEmpty(method)) return;
- // Leggi entrambi i campi
- var oldVal = _db.HashGet(key, "old");
- var newVal = _db.HashGet(key, "new");
+ var cacheKey = $"weights:{method}";
- // Se entrambi mancanti, inizializza con default (usando HSet con When.NotExists per evitare overwrite)
- if (oldVal.IsNull && newVal.IsNull)
- {
- // Imposta i campi singolarmente con When.NotExists per evitare overwrite
- _db.HashSet(key, "old", _defaultOld, When.NotExists);
- _db.HashSet(key, "new", _defaultNew, When.NotExists);
-
- // Rileggi per essere sicuri
- oldVal = _db.HashGet(key, "old");
- newVal = _db.HashGet(key, "new");
- }
-
- // Se uno dei due manca, impostalo al default (non sovrascrive l'altro)
- if (oldVal.IsNull)
- {
- _db.HashSet(key, "old", _defaultOld, When.NotExists);
- oldVal = _defaultOld;
- }
- if (newVal.IsNull)
- {
- _db.HashSet(key, "new", _defaultNew, When.NotExists);
- newVal = _defaultNew;
- }
-
- if (!int.TryParse(oldVal.ToString(), out var oldW)) oldW = _defaultOld;
- if (!int.TryParse(newVal.ToString(), out var newW)) newW = _defaultNew;
-
- // clamp 0..100
- oldW = Math.Clamp(oldW, 0, 100);
- newW = Math.Clamp(newW, 0, 100);
-
- return (oldW, newW);
- }
-
- // API per aggiornare i pesi a runtime (opzionale)
- public void SetWeights(string method, int oldWeight, int newWeight)
- {
- var key = _keyPrefix + (string.IsNullOrEmpty(method) ? "unknown" : method);
- _db.HashSet(key, new HashEntry[] {
- new HashEntry("old", Math.Clamp(oldWeight,0,100)),
- new HashEntry("new", Math.Clamp(newWeight,0,100))
- });
+ // Rimuove la chiave dalla RAM (L1) dell'istanza corrente del Gateway
+ _cache.Remove(cacheKey);
}
public async Task
> GetAllWeightsAsync()
@@ -117,20 +80,164 @@ namespace MP.RIOC.Services
return result;
}
+ ///
+ /// Ritorna (oldWeight, newWeight) per il metodo con FusionCache e poi con dati Redis.
+ /// Se non esiste, crea la chiave con i default value.
+ ///
+ public (int oldWeight, int newWeight) GetWeightsFor(string method)
+ {
+ if (string.IsNullOrEmpty(method)) method = "unknown";
+
+ var cacheKey = $"weights:{method}";
+
+ // FusionCache gestisce L1, L2 e se non trova nulla esegue la factory sotto
+ var weights = _cache.GetOrSet(
+ cacheKey,
+ _ =>
+ {
+ // FACTORY DI INIZIALIZZAZIONE (Viene eseguita solo se la cache è vuota ovunque)
+ var redisKey = _keyPrefix + method;
+ var oldVal = _db.HashGet(redisKey, "old");
+ var newVal = _db.HashGet(redisKey, "new");
+
+ if (oldVal.IsNull && newVal.IsNull)
+ {
+ _db.HashSet(redisKey, "old", _defaultOld, When.NotExists);
+ _db.HashSet(redisKey, "new", _defaultNew, When.NotExists);
+ oldVal = _defaultOld;
+ newVal = _defaultNew;
+ }
+
+ if (oldVal.IsNull) { _db.HashSet(redisKey, "old", _defaultOld, When.NotExists); oldVal = _defaultOld; }
+ if (newVal.IsNull) { _db.HashSet(redisKey, "new", _defaultNew, When.NotExists); newVal = _defaultNew; }
+
+ if (!int.TryParse(oldVal.ToString(), out var oldW)) oldW = _defaultOld;
+ if (!int.TryParse(newVal.ToString(), out var newW)) newW = _defaultNew;
+
+ return new RouteWeights(Math.Clamp(oldW, 0, 100), Math.Clamp(newW, 0, 100));
+ },
+ // Durata specifica per questa tipologia di dato
+ options => options.SetDuration(TimeSpan.FromMinutes(10))
+ );
+
+ return (weights.OldWeight, weights.NewWeight);
+
+#if false
+ var key = _keyPrefix + method;
+
+ // Leggi entrambi i campi
+ var oldVal = _db.HashGet(key, "old");
+ var newVal = _db.HashGet(key, "new");
+
+ // Se entrambi mancanti, inizializza con default (usando HSet con When.NotExists per evitare overwrite)
+ if (oldVal.IsNull && newVal.IsNull)
+ {
+ // Imposta i campi singolarmente con When.NotExists per evitare overwrite
+ _db.HashSet(key, "old", _defaultOld, When.NotExists);
+ _db.HashSet(key, "new", _defaultNew, When.NotExists);
+
+ // Rileggi per essere sicuri
+ oldVal = _db.HashGet(key, "old");
+ newVal = _db.HashGet(key, "new");
+ }
+
+ // Se uno dei due manca, impostalo al default (non sovrascrive l'altro)
+ if (oldVal.IsNull)
+ {
+ _db.HashSet(key, "old", _defaultOld, When.NotExists);
+ oldVal = _defaultOld;
+ }
+ if (newVal.IsNull)
+ {
+ _db.HashSet(key, "new", _defaultNew, When.NotExists);
+ newVal = _defaultNew;
+ }
+
+ if (!int.TryParse(oldVal.ToString(), out var oldW)) oldW = _defaultOld;
+ if (!int.TryParse(newVal.ToString(), out var newW)) newW = _defaultNew;
+
+ // clamp 0..100
+ oldW = Math.Clamp(oldW, 0, 100);
+ newW = Math.Clamp(newW, 0, 100);
+
+ return (oldW, newW);
+#endif
+ }
+
+ // API per aggiornare i pesi a runtime (opzionale)
+ public void SetWeights(string method, int oldWeight, int newWeight)
+ {
+ // 1. Scrittura su Redis
+ var key = _keyPrefix + (string.IsNullOrEmpty(method) ? "unknown" : method);
+ _db.HashSet(key, new HashEntry[] {
+ new HashEntry("old", Math.Clamp(oldWeight,0,100)),
+ new HashEntry("new", Math.Clamp(newWeight,0,100))
+ });
+
+ // 2. 🚀 COORDINAZIONE: Rimuovi la chiave da FusionCache.
+ // Grazie al Backplane Pub/Sub, la RAM verrà azzerata istantaneamente su TUTTI i server.
+ var cacheKey = $"weights:{method}";
+ _cache.Remove(cacheKey);
+ }
+
public bool UpsertWeight(WeightDTO updRecord)
{
if (updRecord == null || string.IsNullOrEmpty(updRecord.Method))
return false;
- var key = _keyPrefix + updRecord.Method;
- _db.HashSet(key, new HashEntry[] {
- new HashEntry("old", Math.Clamp(updRecord.OldWeight, 0, 100)),
- new HashEntry("new", Math.Clamp(updRecord.NewWeight, 0, 100))
- });
+ // 1. Scrivi su Redis (Sorgente dati reale)
+ var redisKey = _keyPrefix + updRecord.Method;
+ _db.HashSet(redisKey, new HashEntry[] {
+ new HashEntry("old", Math.Clamp(updRecord.OldWeight, 0, 100)),
+ new HashEntry("new", Math.Clamp(updRecord.NewWeight, 0, 100))
+ });
+
+ // 2. 🚀 COORDINAZIONE: Rimuovi la chiave da FusionCache.
+ // Grazie al Backplane Pub/Sub, la RAM verrà azzerata istantaneamente su TUTTI i server.
+ var cacheKey = $"weights:{updRecord.Method}";
+ _cache.Remove(cacheKey);
return true;
+
+#if false
+ var key = _keyPrefix + updRecord.Method;
+ _db.HashSet(key, new HashEntry[] {
+ new HashEntry("old", Math.Clamp(updRecord.OldWeight, 0, 100)),
+ new HashEntry("new", Math.Clamp(updRecord.NewWeight, 0, 100))
+ });
+
+ return true;
+#endif
}
+ #endregion Public Methods
+
+ #region Private Fields
+
+ private static string _keyPrefix = "route_weight:";
+ private static string _redisBaseKey = "";
+ private readonly IFusionCache _cache;
+
+ ///
+ /// Definizione Record leggero per la cache
+ ///
+ ///
+ ///
+ public record RouteWeights(int OldWeight, int NewWeight);
+ private readonly IConfiguration _config;
+
+ private readonly IDatabase _db;
+
+ private readonly int _defaultNew;
+
+ private readonly int _defaultOld;
+
+ private readonly IConnectionMultiplexer _mux;
+
+ #endregion Private Fields
+
+ #region Private Methods
+
private string KeyToString(string key)
{
if (string.IsNullOrEmpty(key)) return "";
@@ -140,18 +247,6 @@ namespace MP.RIOC.Services
return key;
}
- #endregion Public Methods
-
- #region Private Fields
-
- private static string _keyPrefix = "route_weight:";
- private static string _redisBaseKey = "";
- private readonly IConfiguration _config;
- private readonly IDatabase _db;
- private readonly IConnectionMultiplexer _mux;
- private readonly int _defaultNew;
- private readonly int _defaultOld;
-
- #endregion Private Fields
+ #endregion Private Methods
}
-}
+}
\ No newline at end of file
diff --git a/MP.RIOC/appsettings.Development.json b/MP.RIOC/appsettings.Development.json
index d7f9ed43..4e4724a3 100644
--- a/MP.RIOC/appsettings.Development.json
+++ b/MP.RIOC/appsettings.Development.json
@@ -3,7 +3,8 @@
"LogLevel": {
"Default": "Information",
"Yarp": "Warning",
- "Microsoft.AspNetCore": "Warning"
+ "Microsoft.AspNetCore": "Warning",
+ "FusionCache": "Warning"
}
}
}
diff --git a/MP.RIOC/appsettings.Production.json b/MP.RIOC/appsettings.Production.json
index 7910e3ea..befdd501 100644
--- a/MP.RIOC/appsettings.Production.json
+++ b/MP.RIOC/appsettings.Production.json
@@ -3,7 +3,8 @@
"LogLevel": {
"Default": "Information",
"Yarp": "Warning",
- "Microsoft.AspNetCore": "Warning"
+ "Microsoft.AspNetCore": "Warning",
+ "FusionCache": "Warning"
}
},
"AllowedHosts": "*",
diff --git a/MP.RIOC/appsettings.Staging-silent.json b/MP.RIOC/appsettings.Staging-silent.json
index b68fbaa1..8332e76c 100644
--- a/MP.RIOC/appsettings.Staging-silent.json
+++ b/MP.RIOC/appsettings.Staging-silent.json
@@ -5,11 +5,17 @@
"Yarp": "Warning",
"Microsoft": "Warning",
"Microsoft.AspNetCore": "Warning",
- "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning"
+ "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
+ "FusionCache": "Warning"
}
},
"NLog": {
"rules": [
+ {
+ "logger": "FusionCache",
+ "maxLevel": "Info",
+ "final": true
+ },
{
"logger": "Microsoft.*",
"maxLevel": "Fatal",
diff --git a/MP.RIOC/appsettings.Staging-verbose.json b/MP.RIOC/appsettings.Staging-verbose.json
index cdb99149..5865f347 100644
--- a/MP.RIOC/appsettings.Staging-verbose.json
+++ b/MP.RIOC/appsettings.Staging-verbose.json
@@ -4,7 +4,8 @@
"Default": "Warning",
"Yarp": "Warning",
"Microsoft.EntityFrameworkCore": "Warning",
- "Microsoft.AspNetCore.Hosting.Diagnostics": "Information"
+ "Microsoft.AspNetCore.Hosting.Diagnostics": "Information",
+ "FusionCache": "Warning"
}
},
"NLog": {
diff --git a/MP.RIOC/appsettings.Staging.json b/MP.RIOC/appsettings.Staging.json
index b68fbaa1..8332e76c 100644
--- a/MP.RIOC/appsettings.Staging.json
+++ b/MP.RIOC/appsettings.Staging.json
@@ -5,11 +5,17 @@
"Yarp": "Warning",
"Microsoft": "Warning",
"Microsoft.AspNetCore": "Warning",
- "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning"
+ "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
+ "FusionCache": "Warning"
}
},
"NLog": {
"rules": [
+ {
+ "logger": "FusionCache",
+ "maxLevel": "Info",
+ "final": true
+ },
{
"logger": "Microsoft.*",
"maxLevel": "Fatal",
diff --git a/MP.RIOC/appsettings.json b/MP.RIOC/appsettings.json
index 809c089c..2522b6f6 100644
--- a/MP.RIOC/appsettings.json
+++ b/MP.RIOC/appsettings.json
@@ -6,7 +6,8 @@
"Microsoft.AspNetCore.Hosting.Diagnostics": "Information",
"Microsoft.EntityFrameworkCore.Database.Command": "Warning",
"Microsoft.EntityFrameworkCore": "Warning",
- "Microsoft.AspNetCore": "Warning"
+ "Microsoft.AspNetCore": "Warning",
+ "FusionCache": "Warning"
}
},
"AllowedHosts": "*",
@@ -40,6 +41,11 @@
}
},
"rules": [
+ {
+ "logger": "FusionCache*",
+ "maxLevel": "Info",
+ "final": true
+ },
{
"logger": "Microsoft.EntityFrameworkCore.*",
"maxLevel": "Info",
diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj
index 906a6c6d..379a654a 100644
--- a/MP.SPEC/MP.SPEC.csproj
+++ b/MP.SPEC/MP.SPEC.csproj
@@ -5,7 +5,7 @@
enable
enable
MP.SPEC
- 8.16.2606.1312
+ 8.16.2606.2012
1800a78a-6ff1-40f9-b490-87fb8bfc1394
en
diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html
index b09252cc..31f8f6da 100644
--- a/MP.SPEC/Resources/ChangeLog.html
+++ b/MP.SPEC/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MAPOSPEC
- Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2012
Note di rilascio:
-
diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt
index 84233792..4e825518 100644
--- a/MP.SPEC/Resources/VersNum.txt
+++ b/MP.SPEC/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2012
diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml
index ed5dece3..bfc1b83f 100644
--- a/MP.SPEC/Resources/manifest.xml
+++ b/MP.SPEC/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2012
https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip
https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html
false
diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj
index d203eefb..a52b0539 100644
--- a/MP.Stats/MP.Stats.csproj
+++ b/MP.Stats/MP.Stats.csproj
@@ -4,7 +4,7 @@
net8.0
MP.Stats
826e877c-ba70-4253-84cb-d0b1cafd4440
- 8.16.2606.1312
+ 8.16.2606.2012
true
en
diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html
index ef9a814f..11c89dd6 100644
--- a/MP.Stats/Resources/ChangeLog.html
+++ b/MP.Stats/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo statistiche MAPO
-
Versione: 8.16.2606.1312
+ Versione: 8.16.2606.2012
Note di rilascio:
diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt
index 84233792..4e825518 100644
--- a/MP.Stats/Resources/VersNum.txt
+++ b/MP.Stats/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2606.1312
+8.16.2606.2012
diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml
index 4401e30e..869284bc 100644
--- a/MP.Stats/Resources/manifest.xml
+++ b/MP.Stats/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2606.1312
+ 8.16.2606.2012
https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip
https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html
false