2

We are running a Dotnet Core 2.2 service using ServiceStack 5.7, and need to throttle it. So we want to put it behind a Azure Api Management Gateway (apim) - it runs in a Azure App Service.

We have enabled OpenApi feature using

self.Plugins.Add(new OpenApiFeature());

When we export our OpenApi definition we get the following:

"paths": {
 ...
        "/api/search": {
            "post": {
                "tags": [
                    "api"
                ],
                "operationId": "SearchRequestsearch_Post",
                "consumes": [
                    "application/x-www-form-urlencoded"
                ],
                "produces": [
                    "application/json"
                ],
                "parameters": [
                    {
                        "name": "Filters",
                        "in": "formData",
                        "type": "array",
                        "items": {
                            "$ref": "#/definitions/FilterDto"
                        },
                        "collectionFormat": "multi",
                        "required": false
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/SearchResponse"
                        }
                    }
                },
                "deprecated": false,
                "security": [
                    {
                        "Bearer": []
                    }
                ]
            },

            "parameters": [
                {
                    "$ref": "#/parameters/Accept"
                }
            ]
        }
    }
 ...
"definitions": {
  "FilterDto": {
            "title": "FilterDto",
            "properties": {
                "Field": {
                    "description": "The field to filter on",
                    "type": "string",
                    "enum": [
                        "None",
                        "DestinationName",
                        "DocumentId"
                    ]
                },
                "Values": {
                    type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "Type": {
                    "type": "string",
                    "enum": [
                        "Equals",
                        "NotEquals",
                        "RangeNumeric",
                        "RangeDate"
                    ]
                }
            },
            "description": "FilterDto",
            "type": "object"
        }
        ...
}

The problem is that it is not supported to have a parameter with an array of a type (defined in #/definitions/FilterDto). And it fails with: Parsing error(s): JSON is valid against no schemas from 'oneOf'. Path 'paths['/api/search'].post.parameters[1]', line 1, position 666. Parsing error(s): The input OpenAPI file is not valid for the OpenAPI specificate https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md (schema https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v2.0/schema.json).

In the Azure portal.

In c# (ServiceStack) we have defined the following:

public class SearchRequest : SearchRequestBase, IReturn<SearchResponse>
    {
        public SearchRequest()
        {
            Filters = new List<FilterDto>();
        }

        [ApiMember(Name = "Filters"]
        public List<FilterDto> Filters { get; set; }
    }

public class FilterDto
    {
        [ApiMember(Name = "Field"]
        [ApiAllowableValues("Field", typeof(FilterAndFacetField))] 
        public FilterAndFacetField Field { get; set; }

        [ApiMember(Name = "Values")]
        public List<string> Values { get; set; }

        [ApiMember(Name = "Type")]
        [ApiAllowableValues("Type", typeof(FilterType))]
        public FilterType Type { get; set; }

        public FilterDto()
        {
            Values = new List<string>();
        }
    }

Have anyone successfully managed to import a OpenApi using array of $ref in the parameters from ServiceStack into a Api Management?

Markus Foss
  • 335
  • 4
  • 14
  • Looks like this is not valid OpenAPI in the first place from looking at the [JSON Schema itself](https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v2.0/schema.json#L764). Trying the same on [Swagger Editor](https://editor.swagger.io/) gives an error as well. – PramodValavala Mar 11 '20 at 05:14

0 Answers0