86

私は ASP.NET MVC Web API で作業していましたが、次のエラーが発生しています。

「ObjectContent`1」タイプは、コンテンツ タイプ「application/xml;」の応答本文をシリアル化できませんでした。charset=utf-8'.

私のコントローラーは:

public Employee GetEmployees()
{
    Employee employees = db.Employees.First();
    return employees;
}

なぜこのエラーが発生するのですか?

4

15 に答える 15

43

global.asax ファイルの Application_start() メソッドに次の行を追加します。

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

お役に立てば幸いです。

于 2012-10-09T05:46:13.810 に答える
29

私は同じ問題を抱えています。そして、私はそれを解決しました。デフォルトのコンストラクターを DTO クラスに配置しました。

元:

public class User
{
    public User()
    {
    }
}

それがあなたとうまくいくことを願っています!

于 2013-03-28T17:15:57.507 に答える
22

これをコンストラクタに入れます。これで問題が解決することを願っています:

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }
于 2013-02-27T16:15:09.797 に答える
16

これに対する2つの解決策を見つけました。最初の最も簡単な実装は、IEnumerables、ICollections を List 型に変更することです。WebAPI はこのオブジェクトをシリアル化できますが、インターフェイス タイプをシリアル化することはできません。

public class Store
{

  [StringLength(5)]
    public string Zip5 { get; set; }

    public virtual List<StoreReport> StoreReports { get; set; }  //use a list here
 }

もう 1 つのオプションは、ネイティブ JSON シリアライザーを使用せず、WebApi 構成の Register メソッドでこのオーバーライドを実行することです。

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
于 2013-03-06T02:36:51.210 に答える
8

解決策は簡単です。

LINQ クエリの後に .ToList() (または必要に応じて ToDictionary) を追加します。

データの遅延読み込みよりも熱心な読み込みを行います

于 2013-09-13T17:50:06.123 に答える
5

** このバグは、クライアント側からリクエスト web api/wcf/... から呼び出すときに発生しますが、副作用として、 include キーワードによって依存関係を含める必要があります。**

public CustomerPortalContext()
            : base("Name=CustomerPortalContext")
        {
            base.Configuration.ProxyCreationEnabled = false;
        }
于 2014-04-08T16:38:15.000 に答える
2

デフォルトのエンティティ 6 は API に XMLを使用します。プロジェクトで、「Global.asax」ファイルを見つけて、次の行を追加します。

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

この行は XML フォーマッターを削除します。

于 2016-02-12T20:19:23.260 に答える
1

うーん、以下が役立つかもしれません。

私は同じ例外を受け取っていました。私の場合、最初にエンティティ コード用に作成された実際の poco エンティティを渡していました。他のエンティティとの関係が含まれているため、その上に viewmapper/dto エンティティを作成して返すだけです。

今はうまくいきます。

ポコ エンティティ:

public class Tag
{
public int Id{get;set;}
public string Title{get;set;}
public IList<Location> Locations{get;set;}
}

ViewMapper/Dto

public class TagResultsViewMapper
{
public int Id{get;set;}
public string Title{get;set;}
//just remove the following relationship 
//public IList<Location> Locations{get;set;}
}
于 2013-02-20T06:37:45.830 に答える
1

ただし、他のエンティティ/クラスでこの問題が見つかった場合は、クラスごとに新しい DTO を作成する必要があり、それらが多数ある場合は問題を見つけることができます。また、この問題を解決するためだけに DTO を作成すると思います最善の方法ではありません...

これを試しましたか?

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.All;

よろしく

于 2013-08-14T16:53:01.973 に答える
0

あなたの質問は私のものとよく似ています。データベースから直接データを返してはなりません。このためには、モデルを作成し、表示するデータを関連付ける必要があります。

私の例では、Json がシリアル化できなかった User に関するデータがあります。userModel を作成し、API でデータベースから User の代わりに userModel を返します。

User と UserModel の間でデータを変換または関連付けるロジックは、API にある必要があります。

Json を使用した Web API での応答のシリアル化に失敗しました

于 2014-04-16T22:43:52.237 に答える