forked from oskardudycz/EventSourcing.NetCore
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ExceptionHandlingMiddleware.cs
76 lines (63 loc) · 2.17 KB
/
ExceptionHandlingMiddleware.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System.Net;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace Core.WebApi.Middlewares.ExceptionHandling;
public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate next;
private readonly ILogger logger;
public ExceptionHandlingMiddleware(
RequestDelegate next,
ILoggerFactory loggerFactory
)
{
this.next = next;
logger = loggerFactory.CreateLogger<ExceptionHandlingMiddleware>();
}
public async Task Invoke(HttpContext context /* other scoped dependencies */)
{
try
{
await next(context).ConfigureAwait(false);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex).ConfigureAwait(false);
}
}
private Task HandleExceptionAsync(HttpContext context, Exception exception)
{
logger.LogError(exception, exception.Message);
Console.WriteLine("ERROR:" + exception.Message + exception.StackTrace);
if(exception.InnerException != null)
Console.WriteLine("INNER DETAILS:" + exception.InnerException.Message + exception.InnerException.StackTrace);
var codeInfo = ExceptionToHttpStatusMapper.Map(exception);
var result = JsonConvert.SerializeObject(new HttpExceptionWrapper((int)codeInfo.Code, codeInfo.Message));
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)codeInfo.Code;
return context.Response.WriteAsync(result);
}
}
public class HttpExceptionWrapper
{
public int StatusCode { get; }
public string Error { get; }
public HttpExceptionWrapper(int statusCode, string error)
{
StatusCode = statusCode;
Error = error;
}
}
public static class ExceptionHandlingMiddlewareExtensions
{
public static IApplicationBuilder UseExceptionHandlingMiddleware(
this IApplicationBuilder app,
Func<Exception, HttpStatusCode>? customMap = null
)
{
ExceptionToHttpStatusMapper.CustomMap = customMap;
return app.UseMiddleware<ExceptionHandlingMiddleware>();
}
}