[Fix] Sicurezza e affidabilità storico esecuzioni schedulazioni
- SchedulingHistory.razor / .cs: iniettato IWebHostEnvironment per nascondere lo stack trace (con percorsi di file) in produzione; in produzione viene mostrato solo il messaggio di errore sanitizzato e un avviso che invita a consultare i log dell'applicazione; in sviluppo il dettaglio completo resta visibile invariato. - Scheduling.razor.cs (ExecuteScheduleManually): isolata la notifica JS (ShowSuccessMessage / ShowErrorMessage) in un blocco try-catch separato per TaskCanceledException / OperationCanceledException. In questo modo una disconnessione del browser durante un'esecuzione lunga non sovrascrive più il risultato già salvato correttamente come 'success' con uno stato 'failed' e lo stack trace di un'eccezione JSInterop. L'evento viene registrato come avviso di log senza impatto sul record storico. - ScheduledJobService.cs: aggiunto commento esplicativo sul motivo per cui il dettaglio completo (ex.ToString) è salvato nel DB ma la UI ne mostra solo la versione sanitizzata in produzione.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using CredentialManager.Models;
|
||||
using CredentialManager.Services;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.JSInterop;
|
||||
|
||||
@@ -11,6 +12,29 @@ public partial class SchedulingHistory : ComponentBase
|
||||
[Inject] private IProfileScheduleService ScheduleService { get; set; } = null!;
|
||||
[Inject] private IJSRuntime JSRuntime { get; set; } = null!;
|
||||
[Inject] private ILogger<SchedulingHistory> Logger { get; set; } = null!;
|
||||
[Inject] private IWebHostEnvironment WebHostEnvironment { get; set; } = null!;
|
||||
|
||||
protected bool IsDevelopment => WebHostEnvironment.IsDevelopment();
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce solo il messaggio dell'eccezione (senza stack trace) per la visualizzazione in produzione.
|
||||
/// </summary>
|
||||
protected static string GetSanitizedErrorMessage(string errorDetails)
|
||||
{
|
||||
if (string.IsNullOrEmpty(errorDetails))
|
||||
return string.Empty;
|
||||
|
||||
// Prende solo le righe fino al primo stack frame (riga che inizia con " at")
|
||||
var lines = errorDetails.Split('\n');
|
||||
var messageLines = new System.Collections.Generic.List<string>();
|
||||
foreach (var line in lines)
|
||||
{
|
||||
if (line.TrimStart().StartsWith("at ", StringComparison.Ordinal))
|
||||
break;
|
||||
messageLines.Add(line.TrimEnd());
|
||||
}
|
||||
return string.Join("\n", messageLines).Trim();
|
||||
}
|
||||
|
||||
protected List<ScheduleExecutionHistory>? executionHistory;
|
||||
protected ScheduleExecutionHistory? selectedExecution;
|
||||
|
||||
Reference in New Issue
Block a user