C# 检测到SignalR JSON自引用循环
我有一个.NET类,通过标准信号器(C#,ASP.NET,Visual Studio 2013社区)从web服务器传递到浏览器客户端 此类包含一个属性,该属性本身是对同一类的引用(即数据库术语中的外键引用) 当我的代码只发送简单类型(int、String等)时,一切都正常。当我放入一个本身引用我的服务器类的属性的类并尝试将其发送到浏览器客户端时,我会收到错误消息:“Newtonsoft.Json.JsonSerializationException:检测到属性“ServerAtLocation”的自引用循环…” 试图调用信号集线器以将数据传递给连接的客户端的代码为:C# 检测到SignalR JSON自引用循环,c#,json,json.net,signalr,C#,Json,Json.net,Signalr,我有一个.NET类,通过标准信号器(C#,ASP.NET,Visual Studio 2013社区)从web服务器传递到浏览器客户端 此类包含一个属性,该属性本身是对同一类的引用(即数据库术语中的外键引用) 当我的代码只发送简单类型(int、String等)时,一切都正常。当我放入一个本身引用我的服务器类的属性的类并尝试将其发送到浏览器客户端时,我会收到错误消息:“Newtonsoft.Json.JsonSerializationException:检测到属性“ServerAtLocation”
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<WHub>();
hubContext.Clients.All.serverStatusChangedToClient(myServer);
IHubContext-hubContext=GlobalHost.ConnectionManager.GetHubContext();
hubContext.Clients.All.serverStatusChangedToClient(myServer);
WHub是我的Hub,没有这些复杂的类,它仍然可以正常工作
由于这是一个信号器应用程序,我不确定我是否能够控制JSON的序列化,或者我可以吗?如何发送此对象的实例,包括GridLocation和ParentServer对象的JSON表示(但在对象层次结构中没有比这更深入的内容)?请看替换IJsonSerializer serializer这里,您需要的设置称为ReferenceLoopHandling
尽管我强烈建议不要在应用程序边界之间传递复杂的对象图。在Microsoft.AspNetCore.signar(1.1.0)中的startup.cs In ConfigureServices方法中 您可以执行以下操作
services.AddSignalR().AddJsonProtocol(o =>
{
o.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
太好了,谢谢你,我会查的。考虑不通过复杂对象图形的优点。ijSon系列化器不再存在。用JsonSerializer替换它,您可以在第页上查看我的答案。
services.AddSignalR().AddJsonProtocol(o =>
{
o.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});