49 lines
1.5 KiB
C#
49 lines
1.5 KiB
C#
namespace MyOffice.Web.Infrastructure;
|
|
|
|
using Microsoft.AspNetCore.Diagnostics;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
|
|
|
/// <summary>
|
|
/// Returns ProblemDetails for unhandled exceptions (replaces missing /Error page).
|
|
/// </summary>
|
|
public sealed class UnhandledExceptionHandler : IExceptionHandler
|
|
{
|
|
private readonly IHostEnvironment _environment;
|
|
private readonly ILogger<UnhandledExceptionHandler> _logger;
|
|
private readonly ProblemDetailsFactory _problemDetailsFactory;
|
|
|
|
public UnhandledExceptionHandler(
|
|
IHostEnvironment environment,
|
|
ILogger<UnhandledExceptionHandler> logger,
|
|
ProblemDetailsFactory problemDetailsFactory
|
|
)
|
|
{
|
|
_environment = environment;
|
|
_logger = logger;
|
|
_problemDetailsFactory = problemDetailsFactory;
|
|
}
|
|
|
|
public async ValueTask<bool> TryHandleAsync(
|
|
HttpContext httpContext,
|
|
Exception exception,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
_logger.LogError(exception, "Unhandled exception for {Method} {Path}",
|
|
httpContext.Request.Method,
|
|
httpContext.Request.Path);
|
|
|
|
var problem = _problemDetailsFactory.CreateProblemDetails(
|
|
httpContext,
|
|
statusCode: StatusCodes.Status500InternalServerError,
|
|
title: "An unexpected error occurred.",
|
|
detail: _environment.IsDevelopment() ? exception.Message : null);
|
|
|
|
httpContext.Response.StatusCode = problem.Status ?? StatusCodes.Status500InternalServerError;
|
|
httpContext.Response.ContentType = "application/problem+json";
|
|
await httpContext.Response.WriteAsJsonAsync(problem, cancellationToken);
|
|
return true;
|
|
}
|
|
}
|