ASP.NET WEB API序列化:最佳实践

本文关键字:最佳 序列化 NET WEB API ASP | 更新日期: 2023-09-27 17:58:50

我有一个带有实体框架的ASP.NET WEB API v2项目,当我调用路由时

// GET api/People

我有一个json序列化错误。

所以,我有一个人民实体:

public People()
{
   public int Id { get; set; }
   public string Name{ get; set; }
   ....
   ....
   public virtual ICollection<Role> Role{ get; set; }
   public virtual ICollection<Device> Device { get; set; }
}

控制器:

// GET api/People
public IEnumerable<People> GetPeople()
{
    var p = db.People.ToList<People>().ToList();
    return p;
}

在调试中,p计数了7个元素,这是正确的,但我在序列化中有一个错误。我认为问题出在藏品的装载上。

在WebApiConfig.cs中,我放入了以下代码:

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

那么,在web api中序列化复杂实体的最佳实践是什么呢?我必须返回一个匿名类型,而不是整个People对象?

错误为:

{"$id":"1","Message":"An error has occurred.","ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.","ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"$id":"2","Message":"An error has occurred.","ExceptionMessage":"Error getting value from 'Tessera' on 'System.Data.Entity.DynamicProxies.Tag_0E0771BC33ADE7B095FF6A8E8DC8501A7DB9907E6F3C703A4EDC71C83D881122'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":"   in Newtonsoft.Json.Seria.......

ASP.NET WEB API序列化:最佳实践

默认情况下,这将返回json,除非您将text/xml指定为请求接受头

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);