Skip to content

Error to request endpoint MapPatch using Microsoft.AspNetCore.JsonPatch.SystemTextJson #35707

@vitorafgomes

Description

@vitorafgomes

Description

[Enter feedback here]

Error

System.InvalidOperationException: Maximum validation depth of 32 exceeded at 'SerializerOptions.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default.Default' in 'JsonSerializerOptions'. This is likely caused by a circular reference in the object graph. Consider increasing the MaxDepth in ValidationOptions if deeper validation is required.
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatablePropertyInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableTypeInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidatableParameterInfo.ValidateAsync(Object value, ValidateContext context, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.Validation.ValidationEndpointFilterFactory.<>c__DisplayClass0_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Http.RequestDelegateFactory.g__ExecuteAwaited|129_0(ValueTask1 valueTask, HttpContext httpContext, JsonTypeInfo1 jsonTypeInfo)
at Microsoft.AspNetCore.Http.RequestDelegateFactory.<>c__DisplayClass102_2.<b__2>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

HEADERS

Accept: /
Connection: keep-alive
Host: localhost:5113
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-GB,en;q=0.8
Content-Type: application/json
Origin: http://localhost:5113
Referer: http://localhost:5113/scalar/
Content-Length: 58
sec-ch-ua-platform: "Linux"
sec-ch-ua: "Not)A;Brand";v="8", "Chromium";v="138", "Brave";v="138"
sec-ch-ua-mobile: ?0
Sec-GPC: 1
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty

<PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <RootNamespace>Smart.Management.Sprocket.Api</RootNamespace>
    <AssemblyName>Smart.Management.Sprocket.Api</AssemblyName>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.JsonPatch.SystemTextJson" Version="10.0.0-preview.5.25277.114" />
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0-preview.5.25277.114"/>
    <PackageReference Include="Scalar.AspNetCore" Version="2.5.3" />
    <PackageReference Include="Asp.Versioning.Mvc" Version="8.1.0" />
    <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
    <PackageReference Include="ToolBox.Framework.Hashicorp.Vault.VaultSharp.Extensions.Configuration" Version="0.1.12" />
</ItemGroup>

<ItemGroup>
  <ProjectReference Include="..\Api.Contracts\Api.Contracts.csproj" />
  <ProjectReference Include="..\Infrastructure.CrossCutting\Infrastructure.CrossCutting.csproj" />
</ItemGroup>

<ItemGroup>
  <Folder Include="V1\Common\" />
</ItemGroup>

Request

public class GalleryOfApps
{
public Ulid Id { get; set; }
public string Image { get; set; }
public string Title { get; set; }
public string SubTitle { get; set; }
public string Description { get; set; }
public string Link { get; set; }
public int Order { get; set; }
public bool IsActive { get; set; }
public DateTime CreateDateUtc { get; set; }
public DateTime ModifiedDateUtc { get; set; }
}

public class UpdateRequest
{
public JsonPatchDocument GalleryOfAppsPatchDocument { get; set; }
}
-- EndPint

public static class GalleryOfAppsEndpoints
{
public static WebApplication GalleryOfAppEndpoints(this WebApplication app, ApiVersionSet apiVersionSet)
{
var root = app.MapGroup("/api/v{version:apiVersion}/GalleryOfApp")
.WithTags("galleryofapp")
.WithApiVersionSet(apiVersionSet)
.MapToApiVersion(1)
.WithOpenApi();

    _ = root.MapPost("/", async (string id
        ) =>
        {
            
            var patchDocument = new JsonPatchDocument<GalleryOfApps>();

            patchDocument.Replace(x => x.Title, "Added Title");

            var test = JsonSerializer.Serialize(patchDocument);

            
            
            return Results.Accepted();
        })
        .Produces(StatusCodes.Status201Created)
        .ProducesProblem(StatusCodes.Status400BadRequest)
        .ProducesProblem(StatusCodes.Status401Unauthorized)
        .ProducesProblem(StatusCodes.Status403Forbidden)
        .ProducesProblem(StatusCodes.Status500InternalServerError)
        .ProducesValidationProblem();
    
    
    
    
    
    
    _ = root.MapPatch("/{id}", async (
            string id, 
            [FromBody] JsonPatchDocument<GalleryOfApps> updateRequest) =>
        {
            
            
            var patchDocument = new JsonPatchDocument<GalleryOfApps>();

            patchDocument.Replace(x => x.Title, "Added Title");

            var test = JsonSerializer.Serialize(patchDocument);
            
            
            
            // var updateInput = updateRequestConverter.ToInput(id,updateRequest);
            // await updateInteractor.ExecuteAsync(updateInput);
            // return updatePresenter.ResultModels;
            
            return new PageFilter(); 
        })
        .Produces<GalleryOfApps>(StatusCodes.Status204NoContent)
        .ProducesProblem(StatusCodes.Status400BadRequest)
        .ProducesProblem(StatusCodes.Status401Unauthorized)
        .ProducesProblem(StatusCodes.Status403Forbidden)
        .ProducesProblem(StatusCodes.Status500InternalServerError)
        . DisableAntiforgery();
    
    
    
    
    return app;
}

}
-- Modules
internal static class MinimalApiExtensions
{
internal static WebApplication AddMapEndpoints(this WebApplication webApplication, List apiVersions)
{
var apiVersionSet = webApplication.NewApiVersionSet()
.HasApiVersions(apiVersions)
.ReportApiVersions()
.Build();

    webApplication
        .GalleryOfAppEndpoints(apiVersionSet);
    
    return webApplication;
}

}

internal static class ScalarExtensions
{
internal static IServiceCollection AddScalar(this IServiceCollection services, List apiVersions)
{
var application = services
.BuildServiceProvider()
.GetRequiredService()
.Get();

    foreach (var version in apiVersions)
    {
        services.Configure<ScalarOptions>(options => options.AddDocument($"v{version.MajorVersion}", $"v{version.MajorVersion}"));
        services.AddOpenApi($"v{version.MajorVersion}", options =>
        {
            options.OpenApiVersion = OpenApiSpecVersion.OpenApi3_0;

            // Add document transformer to customize OpenApiInfo
            options.AddDocumentTransformer((document, context, ct) =>
            {
                var provider = context.ApplicationServices.GetRequiredService<IApiVersionDescriptionProvider>();
                var description = provider.ApiVersionDescriptions.FirstOrDefault(d => d.GroupName == context.DocumentName);

                document.Info = new OpenApiInfo
                {
                    Title = "Smart Management Sprocket",
                    Version = description?.ApiVersion.ToString() ?? context.DocumentName,
                    Description = description?.IsDeprecated == true ? "This API version is deprecated." : null
                };

                return Task.CompletedTask;
            });
        });
    }
    
    return services;
}


internal static IApplicationBuilder ConfigureAddScalar(this WebApplication app)
{
    var applicationSettings = app.Configuration.Get<ApplicationSettings>();
    // app.UseAuthentication();
    // app.UseAuthorization();

    app.MapOpenApi();

    app.MapScalarApiReference((options, context) =>
    {
        options
            .WithTheme(ScalarTheme.DeepSpace)
            .WithLayout(ScalarLayout.Modern)
            .WithFavicon("https://scalar.com/logo-light.svg")
            .WithDefaultHttpClient(ScalarTarget.CSharp, ScalarClient.HttpClient);
        
    });
    
    return app;
}

}

internal static class VersioningExtensions
{
internal static IServiceCollection AddVersioning(this IServiceCollection services)
{
services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1);
options.ReportApiVersions = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.ApiVersionReader = new UrlSegmentApiVersionReader();
})
.AddApiExplorer(options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
});

    return services;
}

}

internal static class WebFrameworkExtensions
{
internal static IServiceCollection AddWebFramework(this IServiceCollection services)
{
services
.AddRouting(options => { options.LowercaseUrls = true; })
.Configure(options =>
{
// options.SerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
// options.SerializerOptions.WriteIndented = true;
// options.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
// options.SerializerOptions.MaxDepth = 64;

            options.SerializerOptions.MaxDepth = 64;
        });
    
    services.AddValidation();
    // Add HTTP logging services
    services.AddHttpLogging(logging =>
    {
        // Configure what to log
        logging.LoggingFields = Microsoft.AspNetCore.HttpLogging.HttpLoggingFields.All;
        logging.RequestHeaders.Add("Authorization");
        logging.ResponseHeaders.Add("Content-Type");
        logging.MediaTypeOptions.AddText("application/json");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
    services.AddHttpContextAccessor();

    return services;
}

}

Page URL

https://learn.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-10.0

Content source URL

https://github.com/dotnet/AspNetCore.Docs/blob/main/aspnetcore/web-api/jsonpatch.md

Document ID

6a88d237-1a03-b865-e3c5-20ceedef2a1f

Platform Id

54f6475a-b72c-2ccc-3ab8-5326d9d05c50

Article author

@wadepickett

Metadata

  • ID: 593f528c-61b9-7021-335d-c1c0ec1814d1
  • PlatformId: 54f6475a-b72c-2ccc-3ab8-5326d9d05c50
  • Service: aspnet-core
  • Sub-service: web-api

Related Issues

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions