web-dev-qa-db-ja.com

Asp.Net Web APIエラー: 'ObjectContent`1'タイプは、コンテンツタイプ 'application / xmlの応答本文のシリアル化に失敗しました。 charset = utf-8 '

この最も単純な例では、コレクションを取得し、Web APIを介して出力しようとします。

// GET api/items
public IEnumerable<Item> Get()
{
    return MyContext.Items.ToList();
}

そして、私はエラーを取得します:

タイプのオブジェクト
'System.Data.Objects.ObjectQuery`1 [Dcip.Ams.BO.EquipmentWarranty]'は型に変換できません
'System.Data.Entity.DbSet`1 [Dcip.Ams.BO.EquipmentWarranty]'

これは、新しいプロキシでよく発生するエラーであり、次のように設定することで修正できることがわかっています。

MyContext.Configuration.ProxyCreationEnabled = false;

しかし、それは私がやろうとしていることの多くの目的を無効にします。もっと良い方法はありますか?

35
naspinski

プロキシ作成を無効にするのは、必要のない場所、または問題が発生している場所のみにしてください。グローバルに無効にする必要はありません。コードで現在のDBコンテキストを無効にできます。

    [HttpGet]
    [WithDbContextApi]
    public HttpResponseMessage Get(int take = 10, int skip = 0)
    {
        CurrentDbContext.Configuration.ProxyCreationEnabled = false;

        var lista = CurrentDbContext.PaymentTypes
            .OrderByDescending(x => x.Id)
            .Skip(skip)
            .Take(take)
            .ToList();

        var count = CurrentDbContext.PaymentTypes.Count();

        return Request.CreateResponse(HttpStatusCode.OK, new { PaymentTypes = lista, TotalCount = count });
    }

ここでは、リクエストごとに新しいDBContextが作成されるため、このメソッドでProxyCreationのみを無効にしました。したがって、このケースではProxyCreationのみを無効にしました。それが役に立てば幸い

24
visar_uruqi

ナビゲーションプロパティがあり、それらを非仮想にしたくない場合は、JSON.NETを使用し、App_Startの構成をXMLではなくJSONを使用するように変更する必要があります。
JSON.NETをNuGetからインストールした後、このコードをRegisterメソッドのWebApiConfig.csに挿入します

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
25
Mahdi

ナビゲーションプロパティがある場合は、それらを非仮想にします。マッピングは引き続き機能しますが、シリアル化できないダイナミックプロキシエンティティの作成を防ぎます。]

永続的な接続がなく、とにかく.ToList()を実行したため、WebApiでは遅延読み込みを行わなくても問題ありません。

12
Oliver

必要に応じてプロキシクラスを無効にしました。

    // GET: ALL Employee
    public IEnumerable<DimEmployee> Get()
    {
        using (AdventureWorks_MBDEV_DW2008Entities entities = new AdventureWorks_MBDEV_DW2008Entities())
        {
            entities.Configuration.ProxyCreationEnabled = false;
            return entities.DimEmployees.ToList();
        }
    }
7
mbdevlists

これは私を助けました:
次のコードをGlobal.asax.csApplication_Start関数に追加します

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
    .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters
    .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
4
Adrita Sharma

私の場合、返されるオブジェクトには、引数なし/デフォルトコンストラクターを持たないタイプのプロパティが含まれていました。引数なしのコンストラクタをその型に追加することにより、オブジェクトを正常にシリアル化できます。

3
Josh