diff --git a/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs b/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs index a7d3132..fca64f7 100644 --- a/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs +++ b/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs @@ -107,9 +107,11 @@ public static IServiceCollection AddJsonApiToolkit(this IServiceCollection servi { jsonInputFormatter.SupportedMediaTypes.Add("application/vnd.api+json"); } + options.Filters.AddService(); }); services.AddScoped(); + services.AddScoped(); return services; } diff --git a/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs b/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs new file mode 100644 index 0000000..3bb035b --- /dev/null +++ b/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace JsonApiToolkit.Filters; + +/// +/// A filter that sets the content type of the response to "application/vnd.api+json" +/// for all JSON API responses. +/// +public class JsonApiContentTypeFilter : IActionFilter +{ + private const string JsonApiMediaType = "application/vnd.api+json"; + + /// + /// Does nothing before the action executes. + /// + public void OnActionExecuting(ActionExecutingContext context) + { + // No action needed before executing the action + } + + /// + /// Sets the content type of the response to "application/vnd.api+json" + /// for all JSON API responses. + /// + public void OnActionExecuted(ActionExecutedContext context) + { + if (context.Result is ObjectResult objectResult) + { + objectResult.ContentTypes.Clear(); + objectResult.ContentTypes.Add(JsonApiMediaType); + } + else if (context.Result is StatusCodeResult) + { + context.HttpContext.Response.ContentType = JsonApiMediaType; + } + } +}