dramaling-vocab-learning/backend/DramaLing.Api/Middleware/ErrorHandlingMiddleware.cs

66 lines
2.1 KiB
C#

using System.Net;
using System.Text.Json;
namespace DramaLing.Api.Middleware;
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<ErrorHandlingMiddleware> _logger;
public ErrorHandlingMiddleware(RequestDelegate next, ILogger<ErrorHandlingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
_logger.LogError(ex, "An unhandled exception occurred during request execution. Request: {Method} {Path}",
context.Request.Method, context.Request.Path);
await HandleExceptionAsync(context, ex);
}
}
private async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
context.Response.ContentType = "application/json";
var errorResponse = new
{
Success = false,
Error = "An error occurred while processing your request",
Details = exception.Message,
Timestamp = DateTime.UtcNow,
RequestId = context.TraceIdentifier
};
var statusCode = exception switch
{
ArgumentException => HttpStatusCode.BadRequest,
UnauthorizedAccessException => HttpStatusCode.Unauthorized,
KeyNotFoundException => HttpStatusCode.NotFound,
NotImplementedException => HttpStatusCode.NotImplemented,
TimeoutException => HttpStatusCode.RequestTimeout,
_ => HttpStatusCode.InternalServerError
};
context.Response.StatusCode = (int)statusCode;
var jsonResponse = JsonSerializer.Serialize(errorResponse, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
_logger.LogError("Error response sent: {StatusCode} - {Response}", statusCode, jsonResponse);
await context.Response.WriteAsync(jsonResponse);
}
}