2017-05-18 21 views
0

にレスポンスボディをシリアル化に失敗しました。私は単に私のデータベースからいくつかのデータを返すようにしようとしてASP.NETのWeb APIに取り組んでいますが、私はこのエラーを取得しておいてください。は、ASP.NETのWeb API

The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.

私が持っています私のような他の質問で示唆されているように、Global.asaxファイルに以下を追加しようとしましたが、エラーのフォーマットを変更するだけです。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter)。

私のコントローラには、以下のようになります。

public class SQLController : ApiController 
{ 
    public IEnumerable<Alias> Get() 
    { 
     using (DatabaseEntities entities = new DatabaseEntities()) 
     { 
      return entities.Aliases.ToList(); 
     } 
    } 

    public Alias Get(int id) 
    { 
     using (DatabaseEntities entities = new DatabaseEntities()) 
     { 
      return entities.Aliases.FirstOrDefault(a => a.ID == id); 
     } 
    } 
} 

私ははるかに簡単なデータベースと非常に似た何かを試してみましたが、それがうまく働きました。私は、別のデータモデルを作ることでこの問題を解決できるということも読んだことがありますか?もしそうなら、私はそれをどうやってやりますか?なぜ私がこのエラーを受け取っているのか理解するのに役立つでしょう。

+0

てみconfig.Formatters.Remove(config.Formatters.XmlFormatter)を追加します。あなたのwebapiconfig.csに送信してください。 – RandomUs1r

答えて

0

エンティティフレームワーク関連のエンティティを遅延ロードし、エンドレスループを作成する際の問題のように見えます。

遅延読み込みを無効にし、関連するオブジェクトを手動で読み込むことをお勧めします。 コンテキスト全体に対してレイジーローディングをグローバルに無効にすることができます。一部のリレーションに対してのみ、またはクエリごとにローカルにすることもできます。

グローバルに:ローカル

public class BloggingContext : DbContext 
{ 
    public BloggingContext() 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 
} 

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 
    public string Url { get; set; } 
    public string Tags { get; set; } 

    public ICollection<Post> Posts { get; set; } 
} 

の場合:あなたは、特定のプロパティに無効にしたい場合は

using (DatabaseEntities entities = new DatabaseEntities()) 
{ 
    entities.Configuration.LazyLoadingEnabled = false; 
    return entities.Aliases.FirstOrDefault(a => a.ID == id); 
} 

すると、あなただけのナビゲーションプロパティから仮想削除する必要がありますこれに関するより多くのデータは、公式のmicrsofotのドキュメントを参照してください。https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

0

戻り値の型のためにこの

使用 "IHttpActionResult" を試してみてください

[HttpGet] 
public IHttpActionResult Get() 
{ 
    using (DatabaseEntities entities = new DatabaseEntities()) 
    { 
     return Ok(entities.Aliases.ToList()); 
    } 
} 

public IHttpActionResult Get(int id) 
{ 
    using (DatabaseEntities entities = new DatabaseEntities()) 
    { 
     return Ok(entities.Aliases.FirstOrDefault(a => a.ID == id)); 
    } 
}