2
respostas

Retorno 500 do Postman/Swagger após gravação no BD.

Olá, estou recebendo uma mensagem de erro, tanto no swagger quanto no postman após Executar um novo cadastro no banco.

PS: Os dados são gravados normalmente no banco, mesmo assim recebo um status code "500". Fiz até um outro projeto em paralelo com o do curso, mesmo assim recebo o mesmo erro.

Mensagem de erro {Swagger}:

System.InvalidOperationException: No route matches the supplied values.
   at Microsoft.AspNetCore.Mvc.CreatedAtActionResult.OnFormatting(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncCore(ActionContext context, ObjectResult result, Type objectType, Object value)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsync(ActionContext context, ObjectResult result)
   at Microsoft.AspNetCore.Mvc.ObjectResult.ExecuteResultAsync(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultAsync(IActionResult result)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)

   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)

   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)

   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)

   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)

   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)

   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)



HEADERS

=======

Accept: */*

Host: localhost:7166

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0

:method: POST

Accept-Encoding: gzip, deflate, br

Accept-Language: en-US,en;q=0.5

Content-Type: application/json

Origin: https://localhost:7166

Referer: https://localhost:7166/swagger/index.html

TE: trailers

Content-Length: 258

sec-fetch-dest: empty

sec-fetch-mode: cors

sec-fetch-site: same-origin

Além disso, tentei reescrever o método AdicionarFilme/AdicionarPessoa, ambos os projetos, continuou funcionando normalmente, e com a mesma mensagem de erro...

Método antigo:

[HttpPost]
    public IActionResult AdicionarPessoa([FromBody] Pessoa pessoa)
    {
        pessoa.SetPessoaId();
        _context.Pessoas.Add(pessoa);
        _context.SaveChanges();
        return CreatedAtAction(nameof(RecuperaPessoaCadastrada),
            new { id = pessoa.PessoaId },
            pessoa);
    }

Método reescrito:

[HttpPost]
    public IActionResult AdicionarPessoa([FromBody] Pessoa pessoa)
    {
        pessoa.SetPessoaId();
        _context.Pessoas.Add(pessoa);
        _context.SaveChanges();
        return RecuperaPessoaCadastrada(pessoa.PessoaId);
    }

embora esteja funcionando, acredito que não deveria receber a mensagem de erro acima quando eu faço o /Post.

2 respostas

Conseguir resolver o problema, não sei se é a melhor maneira... Mas resolvi, de qualquer forma, se algum professor puder explicar o motivo, fico agradecido.

Como eu estava estudando, "bulindo", fiz um método interno e deixei a assinatura dele como private, private IActionResult RecuperaPessoaCadastrada(Guid id) porque não queria que ele fosse acessado de fora do escopo da classe.

Quando eu fazia um /Post os dados eram gravados no banco, e o retorno do método é justamente mostrar o usuário cadastrado, acredito que o método não estava sendo executado, o que causou a mensagem de erro. A solução que eu encontrei foi substituir a palavra reservada private para internal ficando internal IActionResult RecuperaPessoaCadastrada(Guid id). Após essa mudança não tive mais a mensagem de erro.

Olá Jimmie!

Pelo erro que você está recebendo no Swagger, parece que o problema está na rota que você está tentando acessar. A mensagem de erro indica que não há uma rota correspondente para os valores fornecidos. Isso pode acontecer se você estiver passando valores inválidos ou se a rota não estiver configurada corretamente.

Uma possível solução seria verificar se a rota está configurada corretamente no seu projeto. Certifique-se de que o nome da rota e os parâmetros estão corretos. Além disso, verifique se os valores que você está passando estão de acordo com o que é esperado pela rota.

Outra possível causa do erro pode ser a falta de configuração do endpoint no Swagger. Certifique-se de que o endpoint que você está tentando acessar está configurado corretamente no arquivo de configuração do Swagger.

Quanto à diferença entre os métodos AdicionarPessoa antigo e reescrito, ambos estão corretos e devem funcionar da mesma forma. A diferença está apenas na forma como o retorno é feito. No método antigo, você está retornando um CreatedAtAction, enquanto no método reescrito você está chamando diretamente o método RecuperaPessoaCadastrada. Ambas as abordagens são válidas, mas é importante garantir que o método RecuperaPessoaCadastrada esteja configurado corretamente para retornar os dados esperados.

Espero que essas sugestões possam te ajudar a resolver o problema. Se tiver mais alguma dúvida, é só me dizer! Espero ter ajudado e bons estudos!