簡體   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