93 lines
3.4 KiB
C#
93 lines
3.4 KiB
C#
// ***********************************************************************
|
|
// <copyright file="HttpErrorMiddleware.cs">
|
|
// Heath
|
|
// </copyright>
|
|
// ***********************************************************************
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
using Serilog;
|
|
using System.Text.Json;
|
|
|
|
namespace Core.Blueprint.Logging
|
|
{
|
|
/// <summary>
|
|
/// Handles HTTP logging.
|
|
/// </summary>
|
|
public class HttpErrorMiddleware
|
|
{
|
|
private readonly ILogger logger;
|
|
private readonly RequestDelegate requestProcess;
|
|
public readonly ServiceSettings settings;
|
|
|
|
/// <summary>
|
|
/// Creates a new instrance of <see cref="HttpErrorMiddleware"/>.
|
|
/// </summary>
|
|
/// <param name="logger">The logger representig an instance of <see cref="ILogger"/>.</param>
|
|
/// <param name="requestProcess">The request delegate process.</param>
|
|
public HttpErrorMiddleware(ILogger logger, RequestDelegate requestProcess, ServiceSettings settings)
|
|
{
|
|
this.logger = logger;
|
|
this.requestProcess = requestProcess;
|
|
this.settings = settings;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invoke method.
|
|
/// </summary>
|
|
/// <param name="context">The HTTP context.</param>
|
|
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
|
|
public async Task Invoke(HttpContext context)
|
|
{
|
|
try
|
|
{
|
|
await requestProcess(context).ConfigureAwait(false);
|
|
}
|
|
catch (HttpException exception)
|
|
{
|
|
await HandleErrorResponse(
|
|
context,
|
|
exception.Message,
|
|
exception.ErrorCode,
|
|
exception.StatusCode).ConfigureAwait(false);
|
|
}
|
|
catch (Exception defaultException)
|
|
{
|
|
await HandleErrorResponse(
|
|
context,
|
|
defaultException.Message,
|
|
ErrorCodes.InternalServerError,
|
|
StatusCodes.Status500InternalServerError).ConfigureAwait(false);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles error responses.
|
|
/// </summary>
|
|
/// <param name="context">The HTTP context.</param>
|
|
/// <param name="message">The error message.</param>
|
|
/// <param name="errorCode">The error code.</param>
|
|
/// <param name="statusCode">The HTTP status code.</param>
|
|
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
|
|
private async Task HandleErrorResponse(HttpContext context, string? message, string? errorCode, int statusCode)
|
|
{
|
|
var errorMessage = new HttpError(
|
|
message,
|
|
errorCode,
|
|
string.Format(
|
|
Responses.Target,
|
|
context.Request.Method,
|
|
context.Request.Scheme,
|
|
context.Request.Host.Host,
|
|
context.Request.Path));
|
|
|
|
logger.LogError<HttpError>(context, errorMessage, $"{settings.ApplicationName}-{settings.LayerName}");
|
|
|
|
context.Response.ContentType = MimeTypes.ApplicationJson;
|
|
context.Response.StatusCode = statusCode;
|
|
|
|
await context.Response.WriteAsync(JsonSerializer.Serialize(errorMessage)).ConfigureAwait(false);
|
|
}
|
|
}
|
|
}
|
|
|