Introduced ExceptionHandlingMiddleware to catch and log unhandled exceptions, returning standardized JSON error responses. Registered the middleware in the request pipeline. Also made minor formatting and comment improvements in Program.cs and ICatalogRepository.cs.
53 lines
1.4 KiB
C#
53 lines
1.4 KiB
C#
using System.Net;
|
|
using System.Text.Json;
|
|
|
|
namespace DbFirst.API.Middleware;
|
|
|
|
public class ExceptionHandlingMiddleware
|
|
{
|
|
private readonly RequestDelegate _next;
|
|
private readonly ILogger<ExceptionHandlingMiddleware> _logger;
|
|
|
|
public ExceptionHandlingMiddleware(RequestDelegate next, ILogger<ExceptionHandlingMiddleware> logger)
|
|
{
|
|
_next = next;
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task InvokeAsync(HttpContext context)
|
|
{
|
|
try
|
|
{
|
|
await _next(context);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "Unhandled exception");
|
|
await WriteProblemDetailsAsync(context, ex);
|
|
}
|
|
}
|
|
|
|
private static async Task WriteProblemDetailsAsync(HttpContext context, Exception ex)
|
|
{
|
|
if (context.Response.HasStarted)
|
|
{
|
|
throw ex;
|
|
}
|
|
|
|
context.Response.Clear();
|
|
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
|
|
context.Response.ContentType = "application/json";
|
|
|
|
var problem = new
|
|
{
|
|
type = "https://tools.ietf.org/html/rfc9110#section-15.6.1",
|
|
title = "Serverfehler",
|
|
status = context.Response.StatusCode,
|
|
detail = ex.Message,
|
|
traceId = context.TraceIdentifier
|
|
};
|
|
|
|
await context.Response.WriteAsync(JsonSerializer.Serialize(problem));
|
|
}
|
|
}
|