2017-02-09 6 views
0

webapiプロジェクトのエンティティフレームワークオブジェクトに問題があります。 2〜3日前からすべて正常に動作しますが、今はapiが常に「メモリ不足例外」を返します。efオブジェクトを返すWebapi2

最初は古典的な「循環参照エラー」をチェックしますが、そうではありません。 Aで、私はこの

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のオブジェクトを返すようにWEBAPI構成で

webapi2のjson応答ですか?

+0

をどのようにあなたが「メモリ不足」例外がEF6オブジェクトからJSONを生成することによって、引き起こされていると思いますか?サーバー上のメモリ使用量を確認しましたか?大きなオブジェクトを処分していますか?ウェブサイトを再起動すると、この例外が発生しますか? –

+0

OOMが他の方法によって引き起こされた可能性があります。 GetContattoメソッドを呼び出すまでに、アプリケーションプール専用のメモリがすでに使い果たされていて、例外がスローされてしまいます。 – Win

答えて

0
私は本当に今、私はいくつかの発言を持っていたことを、私はあなたの質問にコメントしたときに、あなたが投稿したコードを見ていなかった

必ず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

'常にcall dispose'常に強い言葉です。 RepositoryとUnit of Work Patternsを使用する場合は、各メソッドの内部にDbContextを配置しないでください。 – Win

+0

私はDTO、リポジトリと作業パターンの単位を使用して解決するため、すべてうまく動作しています。質問は私の好奇心のためだけです、なぜなら、2日前に帰ってきたオブジェクトが働いていたからです:) –

関連する問題