检测到SignalR JSON自参考环路

时间:2015-11-13 16:21:18

标签: c# json json.net signalr

我有一个.NET类,我通过标准SignalR(C#,ASP.NET,Visual Studio 2013社区)从Web服务器传递到浏览器客户端。

此类包含一个属性,该属性本身是对同一个类的引用(即数据库术语中的外键引用)。

public class Server
{
    public Guid ServerId;
    public GridLocation Location;
    public DateTime DeployedTs;
    public Server ParentServer;
}
public class GridLocation
{
    public Guid GridLocationId;
    public int X;
    public int Y;
    public Server ServerAtLocation;
}

当我的代码只发送简单类型(int,String等)时,一切正常。一旦我将一个属性本身引用到我的Server类并尝试将其发送到浏览器客户端的类中,我就会收到错误消息:" Newtonsoft.Json.JsonSerializationException:检测到属性的自引用循环' ServerAtLocation' ..."

试图调用SignalR集线器将数据传递给连接的客户端的代码是:

IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<WHub>();
hubContext.Clients.All.serverStatusChangedToClient(myServer);

WHub是我的Hub,没有这些复杂的类,它们再次正常工作。

由于这是一个SignalR应用程序,我不确定我是否可以控制序列化为JSON,还是我?如何发送此对象的实例,包括GridLocation和ParentServer对象的JSON表示(但在对象层次结构中没有更深的深度)?

2 个答案:

答案 0 :(得分:1)

请在此处更换IJsonSerializer序列化程序https://github.com/SignalR/SignalR/wiki/Extensibility,您需要的设置称为ReferenceLoopHandling http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm

虽然我强烈建议不要在应用程序边界之间传递复杂的对象图。

答案 1 :(得分:0)

在Microsoft.AspNetCore.Signalr(1.1.0)中的configure.services方法中的startup.cs 您可以执行以下操作

services.AddSignalR().AddJsonProtocol(o =>
            {
                o.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            });