Skip to content

[Bug]: ApiDescriptionProvider throws Exception #3278

@stefannikolei

Description

@stefannikolei

Describe the bug

I have this ApiDescriptionProvider

nternal class ImageSharpApiDescriptionProvider : IApiDescriptionProvider
{
    public int Order => -1000;

    public void OnProvidersExecuted(ApiDescriptionProviderContext context)
    {
        // nothing
    }

    public void OnProvidersExecuting(ApiDescriptionProviderContext context)
    {
        var apiDescriptionCatalog = new ApiDescription
        {
            HttpMethod = "GET",
            ActionDescriptor = new ActionDescriptor
            {
                RouteValues = new Dictionary<string, string?>
                {
                    // Swagger uses this to group endpoints together.
                    // Group methods together using the service name.
                    ["controller"] = "Catalog",
                },
                DisplayName = "Get image",
            },

            RelativePath = "api/v1/Images/{image}",
            GroupName = "v1",
        };

        AddMediaTypeAndParameters(apiDescriptionCatalog);
        context.Results.Add(apiDescriptionCatalog);
    }

    private static void AddMediaTypeAndParameters(ApiDescription apiDescription)
    {
        apiDescription.SupportedRequestFormats.Add(new ApiRequestFormat { MediaType = "application/json" });

        apiDescription.ParameterDescriptions.Add(
            new ApiParameterDescription
            {
                Name = "image",
                Source = BindingSource.Path,
                DefaultValue = string.Empty,
            }
        );

        apiDescription.ParameterDescriptions.Add(
            new ApiParameterDescription
            {
                Name = "width",
                Source = BindingSource.Query,
                DefaultValue = string.Empty,
                Type = typeof(int),
            }
        );
    }
}

This code does not work with the latest Version 7.3

When i remove the parameter which has BindingSource.Query --> no exception is thrown

Expected behavior

Exception is thrown:

Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorException: Failed to generate Operation for action - Get image. See inner exception
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetParameterStyle(Type type, BindingSource source)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateParameterWithoutFilter(ApiParameterDescription apiParameter, SchemaRepository schemaRepository)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateParameterAndContext(ApiParameterDescription apiParameter, SchemaRepository schemaRepository)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateParameterAsync(ApiParameterDescription apiParameter, SchemaRepository schemaRepository)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateParametersAsync(ApiDescription apiDescription, SchemaRepository schemaRespository, Func`3 parameterGenerator)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateParametersAsync(ApiDescription apiDescription, SchemaRepository schemaRespository)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperationAsync(ApiDescription apiDescription, SchemaRepository schemaRepository, Func`3 parametersGenerator, Func`3 bodyGenerator, Func`3 applyFilters)
   --- End of inner exception stack trace ---
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperationAsync(ApiDescription apiDescription, SchemaRepository schemaRepository, Func`3 parametersGenerator, Func`3 bodyGenerator, Func`3 applyFilters)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperationAsync(ApiDescription apiDescription, SchemaRepository schemaRepository)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperationsAsync(IEnumerable`1 apiDescriptions, SchemaRepository schemaRepository)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GeneratePathsAsync(IEnumerable`1 apiDescriptions, SchemaRepository schemaRepository, Func`3 operationsGenerator)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GeneratePathsAsync(IEnumerable`1 apiDescriptions, SchemaRepository schemaRepository)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwaggerAsync(String documentName, String host, String basePath)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|7_0(Endpoint endpoint, Task requestTask, ILogger logger)

Actual behavior

No Exception :)

Steps to reproduce

No response

Exception(s) (if any)

No response

Swashbuckle.AspNetCore version

No response

.NET Version

No response

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions