Nello scorso script (https://www.aspitalia.com/script/1348/Correlare-Log-Applicazione-Distribuita-ASP.NET-Core.aspx) abbiamo visto come il correlation ID sia utilissimo nel caso di architetture a microservizi, in quanto ci permette di correlare tra loro trace di applicazioni differenti.
In realtà, si tratta di uno strumento che può tornare incredibilmente utile anche in architetture più semplici: immaginiamo il tipico caso di un sito in produzione, che restituisca un errore 500. Come sappiamo, per motivi di sicurezza, non è saggio ritornare dettagli dell'errore al browser, perché potrebbero essere utilizzati per scoprire vulnerabilità applicative. Quello che possiamo fare, però, è ritornare un codice univoco, che possiamo utilizzare poi per filtrare i nostri log: il correlation ID, per l'appunto.
Come farlo in maniera centralizzata? In ASP.NET Core è sufficiente creare un middleware che si occupi di catturare tutte le eccezioni non gestite - del tutto analogo a quello di default, utilizzato per mostrare un messaggio generico nella risposta.
Il nostro punto di partenza è il metodo Configure della classe Startup:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseExceptionHandler(builder =>
{
builder.Run(async context =>
{
var response = new ErrorResponse()
{
ErrorMessage = "There was an error while processing your request.",
CorrelationId = Activity.Current?.RootId
};
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonSerializer.Serialize(response));
});
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}Il metodo UseExceptionHandler è quello tramite cui possiamo registrare un middleware da mandare in esecuzione nel caso di eccezioni non gestite. Al suo interno, non facciamo altro che costruire un oggetto ErrorResponse (una semplice classe POCO con due proprietà ErrorMessage e CorrelationId) tramite il quale possiamo restituire il RootId della Activity corrente che, come abbiamo visto nello script precedente, altri non è che un indicatore univoco dell'intera catena delle chiamate. Successivamente serializziamo l'oggetto e lo inviamo nello stream di risposta.
In questo modo, il body ritornato con uno status code 500 sarà simile al seguente:
{
"ErrorMessage":"There was an error while processing your request.",
"CorrelationId":"1e28e3c4-48c00f784e55e309"
}Questo codice, se opportunamente incluso nei log, ci permetterà di identificare immediatamente le righe relative all'eccezione che si è verificata.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Configurare OpenTelemetry per Application Insights su ASP.NET Core
Integrare OpenTelemetry direttamente in Azure Monitor
Stop alle password con Azure Managed Identity
Nuove validazioni Form Blazor
Self-healing degli unit test con Copilot in GitHub
Blazor e InputHidden in .NET 10
Utilizzare le librerie native di .NET per decomprimere un file zip
Sfruttare la funzione REGEXP_COUNT di Sql Server per contare i record che corrispondono a una certa regular expression
Arricchire l'interfaccia di .NET Aspire
Utilizzare il Null conditional assignment di C# 14
Permettere a un LLM di invocare funzioni con Microsoft.Extensions.AI
Operazioni tra insiemi di array in Javascript
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Caricamenti veloci da CDN e fallback locale con ASP.NET Core
- Utilizzare dati in formato XML in XAML
- Accedere a dati esposti con WebService con Silverlight 1.0


