c# - ASP.NET Web API 序列化 JSON 错误 : "Self Referencing loop"

标签 c# asp.net json asp.net-web-api

与此进行了长期斗争。我正在使用 ASP.NET Web API 来提供与数据库的干净简单的 HTTP/JSON 交互。我有一个实体名称 Reservation,如下所示:

    // Reservation
public class Reservation
{
    public int ID { get; set; } // ID (Primary key)
    public int EquipmentID { get; set; } // EquipmentID
    public string Username { get; set; } // Username
    public DateTime BeginDateTime { get; set; } // BeginDateTime
    public int? Duration { get; set; } // Duration
    public int? ReservationStateID { get; set; } // ReservationStateID
    public DateTime? CheckInDateTime { get; set; } // CheckInDateTime
    public string Note { get; set; } // Note

    // Foreign keys
    public virtual Equipment Equipment { get; set; } // FK_Reservation_EquipmentID
    public virtual ReservationState ReservationState { get; set; } //FK_Reservation_ReservationState
}

到目前为止一切顺利。我正在运行一个简单的 python 脚本来创建一个新的预订,与 http 请求一起传递一个 Reservation JSON 对象。在以前的生活中,我运行了没有数据验证的预订添加代码,并在 HttpActionResult 中返回了 Reservation 对象。我看到的返回是一个很好的 json 对象:

{u'Username': u'name', u'ReservationStateID': 1, u'Equipment': None, u'EquipmentID': 2, u'BeginDateTime': u'2014-05-31T14:00:00Z', u'Note': u'', u'CheckInDateTime': None, u'Duration': 10800, u'ReservationState': None, u'ID': 51}

我有点担心外键 Equipment 和 ReservationState 被包含在返回的对象中,这可能会导致更大的问题,但在适当的时候。 现在我尝试通过收集我的预订引用的设备项目来运行数据验证

Equipment equipmentItem = await db.Equipment.FindAsync(newRes.EquipmentID);

现在,当我尝试执行相同的操作时,在相同的 python 脚本上使用相同的数据,收到的结果是一个可怕的大错误:

"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.", u'StackTrace': None, u'Message': u'An error has occurred.', u'InnerException': {u'ExceptionMessage': u"Self referencing loop detected for property 'Equipment' with type...

我 99% 肯定我数据库中的外键不会创建循环引用,但唉,我在这里。 我想再次指出“成功”的 json 结果中包含外键。我敢打赌,如果我能摆脱那些,我就能摆脱自引用问题。感谢您的帮助!

最佳答案

该错误是由 EF 为外键对象创建代理引起的,使用代理进行序列化时默认序列化程序 (DataContractSerializer) 出错。解决方案是将以下行添加到 Global.asax.cs 文件中:

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

虽然@SKall 的回答确实解决了问题,但并没有在整个项目中解决它,只是解决了我赋予 IgnoreDataMember 属性的属性。

关于c# - ASP.NET Web API 序列化 JSON 错误 : "Self Referencing loop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964407/

相关文章:

c# - 浏览器偶尔会在回发和重定向后丢失用于身份验证的 HttpCookie

javascript - 我如何使用此代码来过滤网格的所有列?

javascript - 如何检查并返回数据直到没有匹配项?

python - 如何将http请求转换为Python?

javascript - 将数据保存到使用 Ajax 以 JSON 形式发送的文本文件中

c# - 多次实现协变接口(interface) : is this behavior properly defined?

c# - List.Contains 无法正常工作

c# - 创建更像 Visual Studio 的 UI 框架

c# - 级联删除代码优先中的外键

c# - 哪个速成版用于 C# 中的 ASP.NET Web 应用程序?