- Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathProgram.cs
73 lines (60 loc) · 1.9 KB
/
Program.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
usingSystem.Net;
usingSystem.Text.Json;
varbuilder=WebApplication.CreateBuilder();
builder.Services.AddSingleton<ErrorHandlingMiddleware>();
varapp=builder.Build();
app.UseMiddleware<ErrorHandlingMiddleware>();
app.Run(context =>thrownewExampleApiException("oops"));
app.Run();
publicinterfaceICustomApiException
{
HttpStatusCodeHttpStatus{get;}
stringHttpMessage{get;}
}
publicclassExampleApiException:Exception,ICustomApiException
{
publicHttpStatusCodeHttpStatus=>HttpStatusCode.Forbidden;
publicstringHttpMessage=>"Resource cannot be accessed.";
publicExampleApiException(stringmessage):base(message)
{
}
}
publicclassErrorDto
{
publicintStatus{get;set;}
publicstringMessage{get;set;}
}
publicclassErrorHandlingMiddleware:IMiddleware
{
privatereadonlyILogger<ErrorHandlingMiddleware>_logger;
publicErrorHandlingMiddleware(ILogger<ErrorHandlingMiddleware>logger)
{
_logger=logger;
}
publicasyncTaskInvokeAsync(HttpContextcontext,RequestDelegatenext)
{
try
{
awaitnext(context);
}
catch(Exceptionex)
{
_logger.LogError(ex,ex.Message);
varhttpStatus=HttpStatusCode.InternalServerError;
varhttpMessage="Internal Server Error";
if(exisICustomApiExceptioncustomException)
{
httpStatus=customException.HttpStatus;
httpMessage=customException.HttpMessage;
}
context.Response.StatusCode=(int)httpStatus;
context.Response.ContentType="application/json";
varerror=newErrorDto()
{
Status=(int)httpStatus,
Message=httpMessage
};
awaitcontext.Response.WriteAsync(JsonSerializer.Serialize(error));
}
}
}