-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExceptionMiddleware.cs
72 lines (63 loc) · 2.11 KB
/
ExceptionMiddleware.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
using MLS.Api.Models;
using MLS.Application.Exceptions;
using System.Net;
namespace MLS.Api.Middleware;
public class ExceptionMiddleware
{
private readonly RequestDelegate _next;
public ExceptionMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
try
{
await _next(httpContext);
}
catch (Exception ex)
{
await HandleExceptionAsync(httpContext, ex);
}
}
private async Task HandleExceptionAsync(HttpContext httpContext, Exception ex)
{
var statusCode = HttpStatusCode.InternalServerError;
CustomProblemDetails problem;
switch (ex)
{
case BadRequestException badRequestException:
statusCode = HttpStatusCode.BadRequest;
problem = new CustomProblemDetails
{
Title = badRequestException.Message,
Status = (int)statusCode,
Detail = badRequestException.InnerException?.Message,
Type = nameof(BadRequestException),
Errors = badRequestException.ValidationErrors
};
break;
case NotFoundException notFound:
statusCode = HttpStatusCode.NotFound;
problem = new CustomProblemDetails
{
Title = notFound.Message,
Status = (int)statusCode,
Type = nameof(NotFoundException),
Detail = notFound.InnerException?.Message
};
break;
default:
problem = new CustomProblemDetails
{
Title = ex.Message,
Status = (int)statusCode,
Type = nameof(HttpStatusCode.InternalServerError),
Detail = ex.StackTrace
};
break;
}
httpContext.Response.StatusCode = (int)statusCode;
await httpContext.Response.WriteAsJsonAsync(problem);
}
}