2
respostas

[Bug] Erro ao ao utilizar pesquisa com nome

Saudações

Dando sequência nas aulas, criei a rota Artistas e Artistas/nome; Artistas funcionou corretamente, mas Artistas/nome ocorre o erro abaixo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Meu código está da seguinte forma:

using ScreenSound.Banco;
using ScreenSound.Modelos;
using System.Text.Json.Serialization;

namespace ScreenSound.API
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
            var app = builder.Build();

            app.MapGet("/Artistas", () => 
            {
                var dal = new DAL<Artista>(new ScreenSoundContext());
                return dal.Listar();
            });

            app.MapGet("/Artistas/{nome}", (string nome) =>
            {
                var dal = new DAL<Artista>(new ScreenSoundContext());
                return dal.RecuperarPor(a => a.Nome.ToUpper().Equals(nome.ToUpper()));
            });

            app.Run();
        }
    }
}

Onde estou errando? Desde já agradeço a atenção!

2 respostas

Oi, Eduardo, tudo bem?

O erro que você está enfrentando está relacionado à desserialização de objetos dinâmicos criados pelo Castle Proxy. Isso pode ocorrer quando você está usando proxies gerados por frameworks como o Entity Framework ou o Castle DynamicProxy, e o System.Text.Json não consegue lidar com a desserialização desses proxies.

Para resolver isso, você pode tentar algumas abordagens:

  1. Desabilitar a geração de proxies dinâmicos: se você não precisa dos proxies dinâmicos, você pode desabilitá-los. No Entity Framework, você pode fazer isso configurando o contexto:

    services.AddDbContext<ScreenSoundContext>(options =>
        options.UseLazyLoadingProxies(false));
    
  2. Usar o Newtonsoft.Json: uma alternativa é usar o Newtonsoft.Json em vez do System.Text.Json. O Newtonsoft.Json tem melhor suporte para proxies dinâmicos. Para fazer isso, você precisa instalar o pacote Microsoft.AspNetCore.Mvc.NewtonsoftJson e configurar o serviço no Program.cs:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.Extensions.DependencyInjection;
    using ScreenSound.Banco;
    using ScreenSound.Modelos;
    
    namespace ScreenSound.API
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                var builder = WebApplication.CreateBuilder(args);
    
                // Adicionando o Newtonsoft.Json
                builder.Services.AddControllers().AddNewtonsoftJson(options =>
                    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
    
                var app = builder.Build();
    
                app.MapGet("/Artistas", () => 
                {
                    var dal = new DAL<Artista>(new ScreenSoundContext());
                    return dal.Listar();
                });
    
                app.MapGet("/Artistas/{nome}", (string nome) =>
                {
                    var dal = new DAL<Artista>(new ScreenSoundContext());
                    var artista = dal.RecuperarPor(a => a.Nome.ToUpper().Equals(nome.ToUpper()));
                    if (artista is null)
                    {
                        return Results.NotFound();
                    }
                    return Results.Ok(artista);
                });
    
                app.Run();
            }
        }
    }
    
  3. Configurar o JsonSerializerOptions: outra abordagem é configurar o JsonSerializerOptions para lidar melhor com os proxies:

    builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options =>
    {
        options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
        options.SerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
    });
    

Espero que uma dessas soluções resolva o problema que você está enfrentando.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Armano

A primeira opção Desabilitar a geração de proxies dinâmicos deu certo, obrigado!