-
Notifications
You must be signed in to change notification settings - Fork 10.4k
Closed
Labels
area-mvcIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesfeature-openapi
Milestone
Description
Is there an existing issue for this?
- I have searched the existing issues
Describe the bug
A very simple circular/recursive data model produces a ton of duplicate schema definitions like Object
, Object2
, Object3
, Object4
, and so on.
Expected Behavior
Each class in C# is represented in the OpenAPI schema only once, as was the case with Swashbuckle.
Steps To Reproduce
- Brand new .NET 9 Web API from template, with OpenAPI enabled.
- Replace WeatherForecastController:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
[HttpGet("GetParent")]
public ParentObject GetParent() => new();
[HttpGet("GetChild")]
public ChildObject GetChild() => new();
}
public class ParentObject
{
public int Id { get; set; }
public List<ChildObject> Children { get; set; } = [];
}
public class ChildObject
{
public int Id { get; set; }
public ParentObject? Parent { get; set; }
}
- Launch app
- Look at
/openapi/v1.json
- Observe
ChildObject2
,ParentObject2
,ParentObject3
, which shouldn't exist.
{
"openapi": "3.0.1",
"info": {
"title": "aspnet9api | v1",
"version": "1.0.0"
},
"servers": [
{
"url": "https://localhost:7217"
},
{
"url": "http://localhost:5067"
}
],
"paths": {
"/WeatherForecast/GetParent": {
"get": {
"tags": [
"WeatherForecast"
],
"responses": {
"200": {
"description": "OK",
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/ParentObject"
}
},
"application/json": {
"schema": {
"$ref": "#/components/schemas/ParentObject"
}
},
"text/json": {
"schema": {
"$ref": "#/components/schemas/ParentObject"
}
}
}
}
}
}
},
"/WeatherForecast/GetChild": {
"get": {
"tags": [
"WeatherForecast"
],
"responses": {
"200": {
"description": "OK",
"content": {
"text/plain": {
"schema": {
"$ref": "#/components/schemas/ChildObject2"
}
},
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChildObject2"
}
},
"text/json": {
"schema": {
"$ref": "#/components/schemas/ChildObject2"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"ChildObject": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"parent": {
"$ref": "#/components/schemas/ParentObject2"
}
}
},
"ChildObject2": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"parent": {
"$ref": "#/components/schemas/ParentObject3"
}
}
},
"ParentObject": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"children": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ChildObject"
}
}
}
},
"ParentObject2": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"children": {
"$ref": "#/components/schemas/#/properties/children"
}
},
"nullable": true
},
"ParentObject3": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"children": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ChildObject"
}
}
},
"nullable": true
}
}
},
"tags": [
{
"name": "WeatherForecast"
}
]
}
.NET Version
9.0.100
Anything else?
In my real-world application, the worst offending model has been duplicated 39 times:
fredriks-eltele, W2Wizard, zce, KLuuKer, AndrewMcLachlan and 27 moreDroppers, emiliovmq, ernesto1596 and ethangillengg
Metadata
Metadata
Assignees
Labels
area-mvcIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesfeature-openapi