[英]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.