Azure / Azure/azure-functions-openapi-extension
OpenApiResponseWithBody fails to serialize object
- Dominant language
- C#
- Stars
- 388
- Forks
- 202
- PR merge metrics
- No merged PRs in 30d
Description
**Describe the issue**
Swagger JSON fails to generate when using OpenApiResponseWithBody attribute.
**To Reproduce**
Steps to reproduce the behavior:
1. `dotnet openapi add url https://developer.swift.com/sites/default/files/specs/Swift-Messaging-API-v1.0.0.yaml`
2. Add Function with HTTP trigger and attributes `[OpenApiOperation]` and `[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, bodyType: typeof(ListDistributionsResponse), contentType: "application/json")]`
5. Open generated Swagger JSON URI at http://localhost:7097/api/swagger.json
**Expected behavior**
Swagger JSON is generated correctly.
**Screenshots**
If applicable, add screenshots to help explain your issue.
**Environment (please complete the following information, if applicable):**
- OS: [e.g. Windows/Mac/Linux] Windows
- Browser [e.g. edge, chrome, firefox, safari] Firefox
- Version [e.g. 22] Tried both 1.5.1 and 2.0.0-preview2
**Additional context**
https://github.com/michaelelleby/azure-functions-openapi-extension-bugreport is a small project demonstrating the issue.
This is the response from the Swagger JSON page:
```
Index was outside the bounds of the array.
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Extensions.TypeExtensions.GetUnderlyingType(Type type)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.ListObjectTypeVisitor.Visit(IAcceptor acceptor, KeyValuePair`2 type, NamingStrategy namingStrategy, Attribute[] attributes)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.OpenApiSchemaAcceptor.Accept(VisitorCollection collection, NamingStrategy namingStrategy)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.ObjectTypeVisitor.ProcessProperties(IOpenApiSchemaAcceptor instance, String schemaName, Dictionary`2 properties, NamingStrategy namingStrategy)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.ObjectTypeVisitor.Visit(IAcceptor acceptor, KeyValuePair`2 type, NamingStrategy namingStrategy, Attribute[] attributes)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.OpenApiSchemaAcceptor.Accept(VisitorCollection collection, NamingStrategy namingStrategy)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.ListObjectTypeVisitor.Visit(IAcceptor acceptor, KeyValuePair`2 type, NamingStrategy namingStrategy, Attribute[] attributes)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.OpenApiSchemaAcceptor.Accept(VisitorCollection collection, NamingStrategy namingStrategy)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.ObjectTypeVisitor.ProcessProperties(IOpenApiSchemaAcceptor instance, String schemaName, Dictionary`2 properties, NamingStrategy namingStrategy)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.ObjectTypeVisitor.Visit(IAcceptor acceptor, KeyValuePair`2 type, NamingStrategy namingStrategy, Attribute[] attributes)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors.OpenApiSchemaAcceptor.Accept(VisitorCollection collection, NamingStrategy namingStrategy)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.DocumentHelper.GetOpenApiSchemas(List`1 elements, NamingStrategy namingStrategy, VisitorCollection collection)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Build(Assembly assembly, OpenApiVersionType version)
at Microsoft.Azure.WebJobs.Extensions.OpenApi.OpenApiTriggerFunctions.RenderSwaggerDocument(OpenApiHttpTriggerContext openApiContext, HttpRequest req, String extension, ExecutionContext ctx, ILogger log)
```
Removing the line `[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, bodyType: typeof(ListDistributionsResponse), contentType: "application/json")]` makes the problem go away, however I need this to make the return type of the API available to users.
Contributor guide
Research direction
Start with TypeExtensions.GetUnderlyingType and ListObjectTypeVisitor.Visit, the first relevant entries in the reported stack trace, then follow how OpenApiResponseWithBody processes ListDistributionsResponse. Done means the Swagger JSON endpoint generates successfully while retaining the response schema; review linked pull request #611 before starting.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- azure, csharp, openapi
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100