Skip to content

Commit d829217

Browse files
committed
extensoins
1 parent 43f10cc commit d829217

11 files changed

Lines changed: 97 additions & 158 deletions

ManagedCode.Communication.Extensions/Extensions/HubOptionsExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public static class HubOptionsExtensions
1010
{
1111
public static void AddCommunicationHubFilter(this HubOptions result, IServiceProvider serviceProvider)
1212
{
13-
var hubFilter = serviceProvider.GetRequiredService<HubExceptionFilterBase>();
13+
var hubFilter = serviceProvider.GetRequiredService<CommunicationHubExceptionFilter>();
1414
result.AddFilter(hubFilter);
1515
}
1616
}

ManagedCode.Communication.Extensions/Extensions/ServiceCollectionExtensions.cs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Diagnostics;
44
using ManagedCode.Communication.Extensions.Filters;
55
using Microsoft.AspNetCore.Http;
6+
using Microsoft.AspNetCore.Mvc;
67
using Microsoft.AspNetCore.SignalR;
78
using Microsoft.AspNetCore.WebUtilities;
89
using Microsoft.Extensions.DependencyInjection;
@@ -58,29 +59,29 @@ public static IServiceCollection AddDefaultProblemDetails(this IServiceCollectio
5859
return services;
5960
}
6061

61-
public static IServiceCollection AddCommunicationFilters<TExceptionFilter, TModelValidationFilter, THubExceptionFilter>(
62-
this IServiceCollection services)
63-
where TExceptionFilter : ExceptionFilterBase
64-
where TModelValidationFilter : ModelValidationFilterBase
65-
where THubExceptionFilter : HubExceptionFilterBase
62+
public static IServiceCollection AddCommunicationFilters(this IServiceCollection services)
6663
{
67-
services.AddScoped<TExceptionFilter>();
68-
services.AddScoped<TModelValidationFilter>();
69-
services.AddScoped<THubExceptionFilter>();
64+
services.AddScoped<CommunicationExceptionFilter>();
65+
services.AddScoped<CommunicationModelValidationFilter>();
66+
services.AddScoped<CommunicationHubExceptionFilter>();
7067
services.AddScoped<ResultToActionResultFilter>();
7168

72-
services.AddControllers(options =>
73-
{
74-
options.Filters.Add<TExceptionFilter>();
75-
options.Filters.Add<TModelValidationFilter>();
76-
options.Filters.Add<ResultToActionResultFilter>();
77-
});
78-
79-
services.Configure<HubOptions>(options =>
80-
{
81-
options.AddFilter<THubExceptionFilter>();
82-
});
83-
8469
return services;
8570
}
71+
72+
public static MvcOptions AddCommunicationFilters(this MvcOptions options)
73+
{
74+
options.Filters.Add<CommunicationExceptionFilter>();
75+
options.Filters.Add<CommunicationModelValidationFilter>();
76+
options.Filters.Add<ResultToActionResultFilter>();
77+
78+
return options;
79+
}
80+
81+
public static HubOptions AddCommunicationFilters(this HubOptions options)
82+
{
83+
options.AddFilter<CommunicationHubExceptionFilter>();
84+
85+
return options;
86+
}
8687
}

ManagedCode.Communication.Extensions/Filters/ExceptionFilterBase.cs renamed to ManagedCode.Communication.Extensions/Filters/CommunicationExceptionFilter.cs

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace ManagedCode.Communication.Extensions.Filters;
1010

11-
public abstract class ExceptionFilterBase(ILogger logger) : IExceptionFilter
11+
public class CommunicationExceptionFilter(ILogger<CommunicationExceptionFilter> logger) : IExceptionFilter
1212
{
1313
public virtual void OnException(ExceptionContext context)
1414
{
@@ -22,20 +22,7 @@ public virtual void OnException(ExceptionContext context)
2222
controllerName, actionName);
2323

2424
var statusCode = GetStatusCodeForException(exception);
25-
26-
var problem = new Problem()
27-
{
28-
Title = exception.GetType().Name,
29-
Detail = exception.Message,
30-
StatusCode = (int)statusCode,
31-
Instance = context.HttpContext.Request.Path,
32-
Extensions =
33-
{
34-
[ExtensionKeys.TraceId] = context.HttpContext.TraceIdentifier
35-
}
36-
};
37-
38-
var result = Result.Fail(problem);
25+
var result = Result.Fail(exception, statusCode);
3926

4027
context.Result = new ObjectResult(result)
4128
{
@@ -51,14 +38,7 @@ public virtual void OnException(ExceptionContext context)
5138
{
5239
logger.LogError(ex, "Error occurred while handling exception in {FilterType}", GetType().Name);
5340

54-
var fallbackProblem = new Problem
55-
{
56-
Title = Titles.UnexpectedError,
57-
StatusCode = (int)HttpStatusCode.InternalServerError,
58-
Instance = context.HttpContext.Request.Path
59-
};
60-
61-
context.Result = new ObjectResult(Result.Fail(fallbackProblem))
41+
context.Result = new ObjectResult(Result.Fail(Titles.UnexpectedError, ex.Message, HttpStatusCode.InternalServerError))
6242
{
6343
StatusCode = (int)HttpStatusCode.InternalServerError
6444
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Microsoft.AspNetCore.SignalR;
4+
using Microsoft.Extensions.Logging;
5+
using static ManagedCode.Communication.Extensions.Helpers.HttpStatusCodeHelper;
6+
using static ManagedCode.Communication.Extensions.Constants.ProblemConstants;
7+
8+
namespace ManagedCode.Communication.Extensions.Filters;
9+
10+
public class CommunicationHubExceptionFilter(ILogger<CommunicationHubExceptionFilter> logger) : IHubFilter
11+
{
12+
public async ValueTask<object?> InvokeMethodAsync(HubInvocationContext invocationContext,
13+
Func<HubInvocationContext, ValueTask<object?>> next)
14+
{
15+
try
16+
{
17+
return await next(invocationContext);
18+
}
19+
catch (Exception ex)
20+
{
21+
logger.LogError(ex, "Unhandled exception in hub method {HubType}.{HubMethod}",
22+
invocationContext.Hub.GetType().Name, invocationContext.HubMethodName);
23+
24+
var statusCode = GetStatusCodeForException(ex);
25+
return ManagedCode.Communication.Result.Fail(ex, statusCode);
26+
}
27+
}
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Linq;
2+
using System.Net;
3+
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.AspNetCore.Mvc.Filters;
5+
using Microsoft.Extensions.Logging;
6+
using static ManagedCode.Communication.Extensions.Constants.ProblemConstants;
7+
8+
namespace ManagedCode.Communication.Extensions.Filters;
9+
10+
public class CommunicationModelValidationFilter(ILogger<CommunicationModelValidationFilter> logger) : IActionFilter
11+
{
12+
13+
public void OnActionExecuting(ActionExecutingContext context)
14+
{
15+
if (!context.ModelState.IsValid)
16+
{
17+
logger.LogWarning("Model validation failed for {ActionName}",
18+
context.ActionDescriptor.DisplayName);
19+
20+
var validationErrors = context.ModelState
21+
.Where(x => x.Value?.Errors.Count > 0)
22+
.SelectMany(x => x.Value!.Errors.Select(e => (x.Key, e.ErrorMessage)))
23+
.ToArray();
24+
25+
var result = ManagedCode.Communication.Result.FailValidation(validationErrors);
26+
27+
context.Result = new BadRequestObjectResult(result);
28+
}
29+
}
30+
31+
public void OnActionExecuted(ActionExecutedContext context)
32+
{
33+
// Not needed for this filter
34+
}
35+
}

ManagedCode.Communication.Extensions/Filters/HubExceptionFilterBase.cs

Lines changed: 0 additions & 39 deletions
This file was deleted.

ManagedCode.Communication.Extensions/Filters/ModelValidationFilterBase.cs

Lines changed: 0 additions & 46 deletions
This file was deleted.

ManagedCode.Communication.Tests/Common/TestApp/HttpHostProgram.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,16 @@ public static void Main(string[] args)
2222

2323
builder.Services.AddAuthorization();
2424

25-
builder.Services.AddCommunicationFilters<TestExceptionFilter, TestModelValidationFilter, TestHubExceptionFilter>();
26-
builder.Services.AddSignalR(options =>
25+
builder.Services.AddCommunicationFilters();
26+
27+
builder.Services.AddControllers(options =>
28+
{
29+
options.AddCommunicationFilters();
30+
});
31+
32+
builder.Services.AddSignalR(options =>
2733
{
34+
options.AddCommunicationFilters();
2835
});
2936

3037

ManagedCode.Communication.Tests/Common/TestApp/TestExceptionFilter.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.

ManagedCode.Communication.Tests/Common/TestApp/TestHubExceptionFilter.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)