Skip to content

Commit ddb4761

Browse files
authored
Merge pull request #65 from PandaTechAM/development
Fix internal server error handling and update package references
2 parents 8994e59 + 709a828 commit ddb4761

File tree

7 files changed

+65
-35
lines changed

7 files changed

+65
-35
lines changed

src/ResponseCrafter/ExceptionHandlers/Http/ApiExceptionHandler.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ private async Task HandleApiExceptionAsync(HttpContext httpContext,
156156
{
157157
var traceId = Activity.Current?.TraceId.ToString() ?? string.Empty;
158158
var instance = CreateRequestPath(httpContext);
159+
var isServerError = exception.StatusCode >= 500;
160+
161+
var clientMessage = isServerError && _visibility != "Private"
162+
? ExceptionMessages.DefaultMessage.ConvertCase(_convention)
163+
: exception.Message.ConvertCase(_convention);
164+
165+
var clientErrors = isServerError && _visibility != "Private"
166+
? null
167+
: exception.Errors.ConvertCase(_convention);
159168

160169
using (_logger.BeginScope(new Dictionary<string, object>
161170
{
@@ -173,24 +182,23 @@ private async Task HandleApiExceptionAsync(HttpContext httpContext,
173182
TraceId = traceId,
174183
Instance = instance,
175184
StatusCode = exception.StatusCode,
176-
Type = exception.GetType()
177-
.Name,
178-
Errors = exception.Errors.ConvertCase(_convention),
179-
Message = exception.Message.ConvertCase(_convention)
185+
Type = isServerError ? "InternalServerError" : exception.GetType().Name,
186+
Errors = clientErrors,
187+
Message = clientMessage
180188
};
181189

182-
httpContext.Response.StatusCode = exception.StatusCode;
190+
httpContext.Response.StatusCode = response.StatusCode;
183191
await httpContext.Response.WriteAsJsonAsync(response, ct);
184192

185-
if (response.Errors is null || response.Errors.Count == 0)
193+
if (isServerError)
186194
{
187-
_logger.LogWarning("ApiException encountered: {Message}", response.Message);
195+
_logger.LogError(exception, "ApiException {StatusCode}: {Message} {@Errors}",
196+
exception.StatusCode, exception.Message, exception.Errors);
188197
}
189198
else
190199
{
191-
_logger.LogWarning("ApiException encountered: {Message} with errors: {@Errors}",
192-
response.Message,
193-
response.Errors);
200+
_logger.LogWarning(exception, "ApiException {StatusCode}: {Message} {@Errors}",
201+
exception.StatusCode, exception.Message, exception.Errors);
194202
}
195203
}
196204
}

src/ResponseCrafter/ExceptionHandlers/SignalR/SignalRExceptionFilter.cs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@ private async Task HandleApiExceptionAsync(HubInvocationContext ctx,
9898
string invocationId)
9999
{
100100
var traceId = Activity.Current?.TraceId.ToString() ?? string.Empty;
101+
var isServerError = ex.StatusCode >= 500;
102+
103+
var clientMessage = isServerError && _visibility != "Private"
104+
? ExceptionMessages.DefaultMessage.ConvertCase(_convention)
105+
: ex.Message.ConvertCase(_convention);
106+
107+
var clientErrors = isServerError && _visibility != "Private"
108+
? null
109+
: ex.Errors.ConvertCase(_convention);
101110

102111
using (_logger.BeginScope(new Dictionary<string, object>
103112
{
@@ -117,19 +126,25 @@ private async Task HandleApiExceptionAsync(HubInvocationContext ctx,
117126
InvocationId = invocationId,
118127
Instance = ctx.HubMethodName,
119128
StatusCode = ex.StatusCode,
120-
Message = ex.Message.ConvertCase(_convention),
121-
Errors = ex.Errors.ConvertCase(_convention)
129+
Message = clientMessage,
130+
Errors = clientErrors
122131
};
123132

124-
if (response.Errors is null || response.Errors.Count == 0)
133+
if (isServerError)
125134
{
126-
_logger.LogWarning("SignalR exception: {Message}", response.Message);
135+
_logger.LogError(ex,
136+
"SignalR ApiException {StatusCode}: {Message} {@Errors}",
137+
ex.StatusCode,
138+
ex.Message,
139+
ex.Errors);
127140
}
128141
else
129142
{
130-
_logger.LogWarning("SignalR exception: {Message} with errors: {@Errors}",
131-
response.Message,
132-
response.Errors);
143+
_logger.LogWarning(ex,
144+
"SignalR ApiException {StatusCode}: {Message} {@Errors}",
145+
ex.StatusCode,
146+
ex.Message,
147+
ex.Errors);
133148
}
134149

135150
await ctx.Hub.Clients.Caller.SendAsync("ReceiveError", response, ctx.Context.ConnectionAborted);

src/ResponseCrafter/Extensions/WebApplicationExtensions.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,21 @@ public static class WebApplicationExtensions
1111
{
1212
public static WebApplicationBuilder AddResponseCrafter(this WebApplicationBuilder builder,
1313
NamingConvention namingConvention = NamingConvention.Default,
14-
bool suppressExceptionHandlerMiddlewareLog = true)
14+
bool suppressExceptionHandlerMiddlewareLog = true)
1515
{
1616
builder.Services.AddSingleton(new NamingConventionOptions
1717
{
1818
NamingConvention = namingConvention
1919
});
2020
builder.Services.AddExceptionHandler<ApiExceptionHandler>();
2121

22-
if (suppressExceptionHandlerMiddlewareLog )
22+
if (!suppressExceptionHandlerMiddlewareLog)
2323
{
24-
builder.Logging.AddFilter(
25-
"Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware",
26-
LogLevel.None);
24+
return builder;
2725
}
2826

29-
27+
builder.Logging.AddFilter("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware", LogLevel.None);
28+
3029
return builder;
3130
}
3231

src/ResponseCrafter/ResponseCrafter.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
<Copyright>MIT</Copyright>
99
<PackageIcon>pandatech.png</PackageIcon>
1010
<PackageReadmeFile>Readme.md</PackageReadmeFile>
11-
<Version>5.2.2</Version>
11+
<Version>5.3.0</Version>
1212
<PackageId>Pandatech.ResponseCrafter</PackageId>
1313
<PackageTags>Pandatech, library, exception handler, exception, middleware, Api response</PackageTags>
1414
<Title>ResponseCrafter</Title>
1515
<Description>Handling exceptions, custom Dtos.</Description>
1616
<RepositoryUrl>https://github.com/PandaTechAM/be-lib-response-crafter</RepositoryUrl>
17-
<PackageReleaseNotes>Nuget updates.</PackageReleaseNotes>
17+
<PackageReleaseNotes>Fixed bug on internal server error exception.</PackageReleaseNotes>
1818
</PropertyGroup>
1919

2020
<ItemGroup>
@@ -27,7 +27,7 @@
2727
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8"/>
2828
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.8"/>
2929
<PackageReference Include="PandaTech.FluentImporter" Version="3.0.9" />
30-
<PackageReference Include="Pandatech.GridifyExtensions" Version="2.0.14" />
30+
<PackageReference Include="Pandatech.GridifyExtensions" Version="2.1.4" />
3131
</ItemGroup>
3232

3333
</Project>

test/ResponseCrafter.Demo/Program.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
using Humanizer;
21
using Microsoft.AspNetCore.Mvc;
32
using Microsoft.AspNetCore.SignalR;
43
using ResponseCrafter.Demo.Hubs;
54
using ResponseCrafter.Enums;
65
using ResponseCrafter.ExceptionHandlers.SignalR;
76
using ResponseCrafter.Extensions;
87
using ResponseCrafter.HttpExceptions;
8+
using SharedKernel.Logging;
99

1010
var builder = WebApplication.CreateBuilder(args);
1111

12+
builder.AddSerilog(LogBackend.ElasticSearch);
13+
1214
builder.Services.AddEndpointsApiExplorer();
1315
builder.Services.AddSwaggerGen();
1416
builder.AddResponseCrafter(NamingConvention.ToSnakeCase);
@@ -47,10 +49,10 @@
4749
});
4850
});
4951

50-
app.MapPost("/errors/dotnet",
52+
app.MapPost("/errors/internal-server-error",
5153
() =>
5254
{
53-
throw new InvalidOperationException("simulated_invalid_operation");
55+
throw new InternalServerErrorException("simulated_internal_server_error");
5456
});
5557

5658
app.MapPost("/errors/500",

test/ResponseCrafter.Demo/ResponseCrafter.Demo.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99

1010
<ItemGroup>
1111
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8" />
12-
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.4" />
12+
<PackageReference Include="Pandatech.SharedKernel" Version="1.8.5" />
13+
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" />
1314
</ItemGroup>
1415

1516
<ItemGroup>
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
{
2-
"Logging": {
3-
"LogLevel": {
2+
"Serilog": {
3+
"MinimumLevel": {
44
"Default": "Information",
5-
"Microsoft.AspNetCore": "Warning"
5+
"Override": {
6+
"Microsoft": "Warning",
7+
"System": "Warning"
8+
}
69
}
710
},
8-
"AllowedHosts": "*",
9-
"ResponseCrafterVisibility" : "Public"
11+
"ConnectionStrings": {
12+
"PersistentStorage": "./persistence"
13+
},
14+
"RepositoryName": "ResponseCrafter.Demo"
1015
}
1116

1217

0 commit comments

Comments
 (0)