2017-02-09 1 views
0

Ich habe ein Problem mit Entity Framework-Objekt in einem Webapi-Projekt. Seit 2-3 Tagen funktioniert alles gut, aber jetzt, die API ich rufe immer "Out of Memory Ausnahme" zurück.Webapi2 Rückgabe ef Objekt

Zuerst suche ich nach dem klassischen "zirkulären Referenzfehler", aber das ist nicht der Fall.

In der WebAPI Konfiguration habe ich diese

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.None; 
     config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.None; 
     config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")); 

Und ef-Objekt zurückgeben I Funktion wie diese

public Contatti GetContatto([FromUri]int id) 
    { 
     var db=new WebEntities(); 
     return(db.Contatti.Single(x=>x.IDContatto == id)); 
    } 

Es gibt eine Möglichkeit, ein ef Objekt zurückzukehren (mit seinem subobject) in einem Antwort von json mit webapi2?

+0

Was macht Ihrer Meinung nach die „Out of Memory“ Ausnahme durch Erzeugen der json von EF6 Objekte verursacht wird? Hast du die Speichernutzung auf dem Server überprüft? Entsorgen Sie große Objekte? Wenn Sie die Website neu starten, erhalten Sie diese Ausnahme weiterhin? –

+0

OOM könnte durch andere Methode (n) verursacht worden sein. Zu der Zeit, als Sie die GetContatto-Methode aufgerufen haben, war der für den Anwendungspool reservierte Speicher bereits erschöpft, und die Ausnahme wurde ausgelöst. – Win

Antwort

0

ich nicht wirklich den Code anschauen hast du geschrieben hast, wenn ich auf Ihre Frage kommentiert, aber jetzt, da ich habe ich einige Bemerkungen haben:

rufen immer entsorgen, warten Sie nicht für die GC um Speicher zu löschen. Obwohl die "Out of Memory" -Ausnahme möglicherweise nicht durch diese spezielle Methode verursacht wird, ist es möglich, dass Sie auch keine anderen (großen) Objekte, wie Bilder, entsorgen. Überprüfe also deinen Code und entsorge die Objekte, wo es möglich ist. Der beste Weg, um "Out of Memory" -Ausnahmen zu verhindern.

public Contatti GetContatto([FromUri]int id) 
    { 
     using(var db = new WebEntities()) 
     { 
      return(db.Contatti.Single(x => x.IDContatto == id)); 
     } 
    } 

Gibt es eine Möglichkeit, um ein ef Objekt zurückzukehren (mit seinem subobject) in einer json Reaktion mit webapi2?

Ja, aber ich würde wirklich empfehlen, keine EF-Objekte zurückzugeben, sondern stattdessen DTO verwenden. Spart viel Ärger!

ein EF Objekt zurückzukehren, Sie unproxy das Objekt ist besser, zuerst:

protected internal T UnProxyItem<T>(T proxyObject) where T : class 
    { 
     var proxyCreationEnabled = this.Configuration.ProxyCreationEnabled; 
     try 
     { 
      this.Configuration.ProxyCreationEnabled = false; 
      return this.Entry(proxyObject).CurrentValues.ToObject() as T; 
     } 
     finally 
     { 
      this.Configuration.ProxyCreationEnabled = proxyCreationEnabled; 
     } 
    } 
+0

'Immer anrufen dispose' Immer ist ein starkes Wort. Wir sollten DbContext nicht innerhalb jeder Methode ablegen, wenn wir Repository und Unit of Work Patterns verwenden. – Win

+0

zu lösen, habe ich DTO, Repository und Arbeitseinheit Muster verwendet, so funktioniert alles gut. Die Frage ist nur für meine Neugier, weil vor zwei Tagen returniung ef-Objekt funktionierte :) –

Verwandte Themen