3
respostas

[Bug] ERRO System.NotSupportedException: Serialization and deserialization of 'System.Action' instances is not supported

Boa tarde pessoal, estou na aula 3 do curso .NET: criando uma API Web com ASP.NET Core e minha API apresenta esse erro descrito abaixo quando vou executar o get Artistas/Djavan -> exemplo. É somente quando executo um artista ou musica especifica, quando vou em artistas no geral funciona normalmente, ja quebrei a cabeça e não consigo resolver.

System.NotSupportedException: Serialization and deserialization of 'System.Action' instances is not supported. Path: $.
 ---> System.NotSupportedException: Serialization and deserialization of 'System.Action' instances is not supported.
   at System.Text.Json.Serialization.Converters.UnsupportedTypeConverter`1.Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.WriteCore(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   --- End of inner exception stack trace ---
   at System.Text.Json.ThrowHelper.ThrowNotSupportedException(WriteStack& state, NotSupportedException ex)
   at System.Text.Json.Serialization.JsonConverter`1.WriteCore(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.SerializeAsync(Stream utf8Json, T rootValue, CancellationToken cancellationToken, Object rootValueBoxed)
   at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.SerializeAsync(Stream utf8Json, T rootValue, CancellationToken cancellationToken, Object rootValueBoxed)
   at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.SerializeAsync(Stream utf8Json, T rootValue, CancellationToken cancellationToken, Object rootValueBoxed)
   at Microsoft.AspNetCore.Http.HttpResponseJsonExtensions.<WriteAsJsonAsync>g__WriteAsJsonAsyncSlow|5_0[TValue](HttpResponse response, TValue value, JsonTypeInfo`1 jsonTypeInfo)
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.ExecuteResultWriteResponse(IResult result, HttpContext httpContext)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

HEADERS
=======
Accept: */*
Connection: keep-alive
Host: localhost:5089
User-Agent: PostmanRuntime/7.36.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Content-Length: 12
Postman-Token: 3a2638c8-f09a-4364-b19d-2208f1fbe15b
3 respostas

Olá, Gabriel! Tudo bem?

Pelo que entendi, o erro que você está enfrentando ocorre quando você tenta serializar ou desserializar uma instância de 'System.Action'. O .NET não suporta a serialização ou desserialização de 'System.Action' e é por isso que você está vendo esse erro.

A causa mais comum para esse problema é que você está tentando passar uma função ou método como um argumento para uma chamada de API. Em vez disso, você deve passar os dados necessários como argumentos e, em seguida, chamar a função ou método dentro do método da API.

Por exemplo, se você tem algo parecido com isso no seu código:

public IActionResult GetArtista([FromBody] Action minhaFuncao)
{
    // código
}

Você deveria mudar para algo como:

public IActionResult GetArtista([FromBody] Artista artista)
{
    minhaFuncao(artista);
    // código
}

E definir minhaFuncao em outro lugar no seu código.

Porém, sem ver seu código, fica um pouco difícil de dizer exatamente qual é o problema. Se você puder compartilhar o código que está causando o erro, talvez eu possa te ajudar de forma mais eficaz.

Espero ter ajudado e bons estudos!

Bom dia! Segue meu repositório com o código no GitHub https://github.com/grpedroso/ScreenSound, ainda não encontrei o erro ;(

Gabriel, enfrentei um problema semelhante e o resolvi trocando os builder.Services de local no código. Antes eles estavam abaixo da declaração do app e os movi para logo abaixo da declaração do builder.

using System.Data.SqlTypes;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Mvc;
using ScreenSound.Banco;
using ScreenSound.Modelos;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<ScreenSoundContext>();
builder.Services.AddTransient<DAL<Artista>>();

builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);

var app = builder.Build();

app.MapGet("/Artistas", ([FromServices] DAL<Artista> dal) =>
{
    return Results.Ok(dal.Listar());
});

// código omitido

Pelo seu código do GitHub, suponho que você tenha resolvido o problema, mas mesmo assim deixo minha contribuição aqui, para o caso de mais pessoas enfrentarem problemas semelhantes.