Click here to Skip to main content
15,867,686 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Dear community,

I try to create an web api endpoint that returns an image in a format that can be defined in the 'Accept-Header' field of the request. I'm using Swashbuckle NugGet Package (Swashbuckle.AspNetCore, Version 6.5.0) and the UI shows the parameter correctly: see Swashbuckle Screenshot.
As you can see there too, the curl parameter -H 'accept: text/plain' is wrong and should be 'image/jpeg'.

The openAPI definition is specified with an
C#
IOperationFilter
that removes Action parameter of a certain type and inserts the Header parameter instead (see code below).

I've no glue what I am doing wrong ...

Thank you for any hint, advice and maybe solution!
Arne

What I have tried:

C#
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using PEAM.API.Model;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace PEAM.API.Middleware.Filter.OpenAPI
{
    public sealed class EaImageFormatFilter
        : IOperationFilter
    {
        private const string PngMimeType = "image/png";
        private const string JpgMimeType = "image/jpeg";
        private const string BmpMimeType = "image/bmp";

        private const string OpenApiStringType = "string";
        private const string AcceptHeader = "Accept";

        private IList<IOpenApiAny> AcceptedImageTypes { get; }

        public EaImageFormatFilter()
        {
            AcceptedImageTypes = new List<IOpenApiAny>()
            {
                new OpenApiString(PngMimeType),
                new OpenApiString(JpgMimeType),
                new OpenApiString(BmpMimeType)
            };
        }
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var parameterType = typeof(EaImageFormat);
            var parameterToRemove = context.ApiDescription.ParameterDescriptions
                                        .Where(parameter => parameter.Type.Equals(parameterType))
                                        .Select(parameter => parameter.Name)
                                        .ToHashSet();

            if (parameterToRemove.Any())
            {
                //--- parameter that are NOT of type EaImageFormat
                var keepParameter = (OpenApiParameter p) => !parameterToRemove.Contains(p.Name);

                //--- remove all parameters of type EaImageFormat
                operation.Parameters = operation.Parameters
                                            .Where(keepParameter)
                                            .ToList();

                //--- add new parameter 'Accept' with location 'Header'
                var parameter = new OpenApiParameter
                {
                    In          = ParameterLocation.Header,
                    Name        = AcceptHeader,
                    Description = "Pass accepted image format, e.g.: image/png, image/jpeg",
                    Required    = false,
                    Schema      = new OpenApiSchema
                    {
                        Type    = OpenApiStringType,
                        Default = new OpenApiString(PngMimeType),
                        Enum    = AcceptedImageTypes
                    },
                };

                operation.Parameters.Add(parameter);
            }
        }
    }
}
Posted
Comments
BillWoodruff 15-Feb-23 21:56pm    
https://learn.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle

?
stdout 16-Feb-23 1:53am    
Not sure what you want to tell me with the posted link ..? i know about this, but there is nothing that would help me. If I'm wrong, please show me more precisely what I missed. Thx.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900