2017-02-09 56 views
0

我在webapi項目中遇到了實體框架對象的問題。 由於2-3天前一切正常,但現在,我稱之爲api總是返回「內存異常」。Webapi2返回ef對象

最初我檢查了經典的「循環引用錯誤」,但事實並非如此。

在的WebAPI的配置我有這個

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")); 

,並返回EF對象我用函數這樣

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

在有一種方法返回一個EF對象(其子對象) json響應webapi2?

+0

是什麼讓你覺得「內存不足」異常是由產生從EF6對象JSON引起的?你有沒有檢查服務器上的內存使用情況?你在處理大對象嗎?當您重新啓動網站時,您是否仍然遇到此異常? –

+0

OOM可能由其他方法引起。當您調用GetContatto方法時,專用於應用程序池的內存已經耗盡,並最終拋出異常。 – Win

回答

0

我真的不看的時候我對你的問題發表了評論你發佈的代碼,但現在,我沒有,我有一些話:

始終調用dispose,不要等待GC清除記憶。雖然「內存不足」異常可能不是由這種特定的方法引起的,但也有可能您並未配置其他(大)對象,如圖像。因此,請檢查您的代碼並儘可能處理對象。防止「內存不足」異常的最佳方法。

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

有沒有辦法在webapi2的json響應中返回一個ef對象(及其子對象)?

是的,但我真的建議不要返回EF對象,但使用DTO的來代替。節省很多麻煩!

返回一個對象EF,你會unproxy對象第一好:

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

'始終呼籲處置'始終是一個強詞。如果我們使用Repository和工作單元模式,我們不應該在每個方法中處理DbContext。 – Win

+0

來解決我用過的DTO,倉庫和工作單元模式,所以一切工作正常。這個問題只是爲了我的好奇心,因爲前兩天returniung ef對象工作:) –