From bbe40000956d59218023dbcaa1ee86e0e2598111 Mon Sep 17 00:00:00 2001 From: Maksym Sadovnychyy Date: Sun, 25 May 2025 21:07:38 +0200 Subject: [PATCH] (feature): webapi middlewares --- src/MaksIT.Core/MaksIT.Core.csproj | 3 +- .../Middlewares/ErrorHandlingMiddleware.cs | 37 +++++++++++++++++++ .../TraceIdLoggingScopeMiddleware.cs | 24 ++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/MaksIT.Core/Webapi/Middlewares/ErrorHandlingMiddleware.cs create mode 100644 src/MaksIT.Core/Webapi/Middlewares/TraceIdLoggingScopeMiddleware.cs diff --git a/src/MaksIT.Core/MaksIT.Core.csproj b/src/MaksIT.Core/MaksIT.Core.csproj index bdce300..3ead881 100644 --- a/src/MaksIT.Core/MaksIT.Core.csproj +++ b/src/MaksIT.Core/MaksIT.Core.csproj @@ -8,7 +8,7 @@ MaksIT.Core - 1.3.9 + 1.4.0 Maksym Sadovnychyy MAKS-IT MaksIT.Core @@ -26,6 +26,7 @@ + diff --git a/src/MaksIT.Core/Webapi/Middlewares/ErrorHandlingMiddleware.cs b/src/MaksIT.Core/Webapi/Middlewares/ErrorHandlingMiddleware.cs new file mode 100644 index 0000000..d053763 --- /dev/null +++ b/src/MaksIT.Core/Webapi/Middlewares/ErrorHandlingMiddleware.cs @@ -0,0 +1,37 @@ +using System.Text.Json; + +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; + + +namespace MaksIT.Core.Webapi.Middlewares; + +public class ErrorHandlingMiddleware { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + public ErrorHandlingMiddleware(RequestDelegate next, ILogger logger) { + _next = next; + _logger = logger; + } + + public async Task Invoke(HttpContext context) { + try { + await _next(context); // proceed to next middleware + } + catch (Exception ex) { + _logger.LogError(ex, "Unhandled exception"); + + context.Response.StatusCode = 500; + context.Response.ContentType = "application/json"; + + var errorResponse = new { + error = "An unexpected error occurred.", + details = ex.Message // or omit in production + }; + + var json = JsonSerializer.Serialize(errorResponse); + await context.Response.WriteAsync(json); + } + } +} \ No newline at end of file diff --git a/src/MaksIT.Core/Webapi/Middlewares/TraceIdLoggingScopeMiddleware.cs b/src/MaksIT.Core/Webapi/Middlewares/TraceIdLoggingScopeMiddleware.cs new file mode 100644 index 0000000..e7376cb --- /dev/null +++ b/src/MaksIT.Core/Webapi/Middlewares/TraceIdLoggingScopeMiddleware.cs @@ -0,0 +1,24 @@ +using System.Diagnostics; + +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; + +namespace MaksIT.Core.Webapi.Middlewares; + +public class TraceIdLoggingScopeMiddleware { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + public TraceIdLoggingScopeMiddleware(RequestDelegate next, ILogger logger) { + _next = next; + _logger = logger; + } + + public async Task InvokeAsync(HttpContext context) { + var traceId = Activity.Current?.TraceId.ToString() ?? context.TraceIdentifier; + + using (_logger.BeginScope(new Dictionary { ["TraceId"] = traceId })) { + await _next(context); + } + } +} \ No newline at end of file