我有一个.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表示(但在对象层次结构中没有其他深度)?
在此处查看替换IJsonSerializer序列化程序https://github.com/SignalR/SignalR/wiki/Extensibility,您需要的设置称为ReferenceLoopHandlinghttp://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm
尽管我强烈建议不要在应用程序边界之间传递复杂的对象图。
在ConfigureServices方法中的startup.cs中的Microsoft.AspNetCore.Signalr(1.1.0)您可以执行以下
services.AddSignalR().AddJsonProtocol(o =>
{
o.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});