繁体   English   中英

检测到SignalR JSON自引用循环

[英]SignalR JSON Self Referencing Loop Detected

我有一个.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是我的集线器,它在没有这些复杂类的情况下也可以正常工作。

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

https://github.com/SignalR/SignalR/wiki/Extensibility上查看替换IJsonSerializer序列化程序,所需的设置称为ReferenceLoopHandling http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM