Impossibile ottenere il controller ASP.NET MVC 6 per restituire JSON

asp.net-core-mvc asp.net-web-api c# entity-framework-core json

Domanda

Ho un progetto MVC 6 in cui sto usando Fiddler per testare le API Web. Se prendo la seguente azione del controller che utilizza EntityFramework 7 per restituire una lista. Quindi l'html andrà bene.

[HttpGet("/")]
public IActionResult Index()
{
    var model = orderRepository.GetAll();

    return View(model);
}

Ma quando provo a restituire una risposta JSON, ottengo invece un errore 502.

[HttpGet("/")]
public JsonResult Index()
{
    var model = orderRepository.GetAll();

    return Json(model);
}

Qualche idea sul perché l'oggetto non è serializzato correttamente in json?

Risposta accettata

Prima di tutto è possibile utilizzare IEnumerable<Order> o IEnumerable<object> come tipo restituito invece di JsonResult e restituire solo orderRepository.GetAll() . Vi consiglio di leggere l'articolo con ulteriori informazioni.

Informazioni su un altro errore con Bad Gateway. Prova ad aggiungere Newtonsoft.Json nell'ultima versione 8.0.2 alle dipendenze in package.json e usare use

services.AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling =
            Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

Dal modo in cui si può riprodurre l'errore "Errore HTTP 502.3 - Bad Gateway", che si descrive se ho appena impostato breakpoint sulla dichiarazione di ritorno del codice funzionante e attendere abbastanza a lungo. Quindi vedrai l'errore "Errore HTTP 502.3 - Bad Gateway" molto presto su molti errori comuni.

Puoi considerarci opzioni di serializzazione più utili. Per esempio

services.AddMvc()
    .AddJsonOptions(options => {
        // handle loops correctly
        options.SerializerSettings.ReferenceLoopHandling =
            Newtonsoft.Json.ReferenceLoopHandling.Ignore;

        // use standard name conversion of properties
        options.SerializerSettings.ContractResolver =
            new CamelCasePropertyNamesContractResolver();

        // include $id property in the output
        options.SerializerSettings.PreserveReferencesHandling =
            PreserveReferencesHandling.Objects;
    });


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché