Errore API Asp.Net Web: il tipo ‘ObjectContent`1’ non è riuscito a serializzare il corpo della risposta per il tipo di contenuto ‘application / xml; charset = utf-8’

Il più semplice esempio di questo, ottengo una collezione e provo a produrla tramite l’API Web:

// GET api/items public IEnumerable Get() { return MyContext.Items.ToList(); } 

E ottengo l’errore:

Oggetto di tipo
‘System.Data.Objects.ObjectQuery`1 [Dcip.Ams.BO.EquipmentWarranty]’ non può essere convertito in tipo
‘System.Data.Entity.DbSet`1 [Dcip.Ams.BO.EquipmentWarranty]’

Questo è un errore piuttosto comune da fare con i nuovi proxy, e so che posso sistemarlo impostando:

 MyContext.Configuration.ProxyCreationEnabled = false; 

Ma ciò sconfigge lo scopo di molto di ciò che sto cercando di fare. C’è un modo migliore?

Ti suggerisco di distriggersre la creazione proxy solo nel punto in cui non ti serve o ti sta causando problemi. Non devi disabilitarlo globalmente puoi semplicemente disabilitare il contesto attuale del DB tramite codice …

  [HttpGet] [WithDbContextApi] public HttpResponseMessage Get(int take = 10, int skip = 0) { CurrentDbContext.Configuration.ProxyCreationEnabled = false; var lista = CurrentDbContext.PaymentTypes .OrderByDescending(x => x.Id) .Skip(skip) .Take(take) .ToList(); var count = CurrentDbContext.PaymentTypes.Count(); return Request.CreateResponse(HttpStatusCode.OK, new { PaymentTypes = lista, TotalCount = count }); } 

Qui ho solo disabilitato ProxyCreation in questo metodo, perché per ogni richiesta è stato creato un nuovo DBContext e quindi ho solo disabilitato ProxyCreation per questo caso. Spero che sia d’aiuto

se disponi di proprietà di navigazione e non vuoi renderle non virtuali, dovresti utilizzare JSON.NET e modificare la configurazione in App_Start per utilizzare JSON non XML!
dopo l’installazione di JSON.NET da NuGet, inserire questo codice in WebApiConfig.cs nel metodo Register

 var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter); 

Se disponi di proprietà di navigazione, non renderle virtuali. La mapping continuerà a funzionare ma impedisce la creazione di quadro proxy dinamiche che non possono essere serializzate.]

Non avere il caricamento lazy va bene in un WebApi in quanto non si ha una connessione persistente e si esegue comunque un .ToList ().

Ho appena disabilitato le classi proxy per ogni necessità:

  // GET: ALL Employee public IEnumerable Get() { using (AdventureWorks_MBDEV_DW2008Entities entities = new AdventureWorks_MBDEV_DW2008Entities()) { entities.Configuration.ProxyCreationEnabled = false; return entities.DimEmployees.ToList(); } } 

Questo mi ha aiutato:
Aggiungere il seguente codice nella funzione Application_Start di Global.asax.cs

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; GlobalConfiguration.Configuration.Formatters .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

Nel mio caso l’object da restituire aveva una proprietà al suo interno con un tipo che non aveva un costruttore senza argomenti / default. Aggiungendo un costruttore con argomento zero a quel tipo, l’object potrebbe essere serializzato correttamente.