通过 SignalR 发送不同对象的列表

Jon*_*nas 3 c# signalr-hub .net-core asp.net-core-signalr

通过 SignalR 向客户端发送不同对象列表的最佳方式是什么?

当我使用具有相同基类的对象列表时,客户端仅接收基类的属性:

class Update { }
class UpdateA { public string PropertyA {get; set;}}
class UpdateB { public string PropertyB {get; set;}}
...
IEnumerable<Update> updates = GetUpdates();
await Clients.Caller.SendAsync("update", updates);
Run Code Online (Sandbox Code Playgroud)

当我使用字符串形式的预序列化数据时,序列化器将 json 数据转义为字符串。

IEnumerable<string> updates = GetUpdates();
await Clients.Caller.SendAsync("update", updates);
// data looks like: [ "{...}", "{...}" ]
Run Code Online (Sandbox Code Playgroud)

我必须编写自己的序列化程序吗?SignalR 在 dotnet core 中如何工作?

fha*_*eau 5

我知道这是一个老问题,但这是另一个解决方案,不需要您自己编写CustomConverter并依赖于该NewtonSoft解决方案:

  1. 首先你需要安装这个包: Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson

  2. 在服务器端,您需要在类中添加以下调用Startup.cs

    services.AddSignalR()
        .AddNewtonsoftJsonProtocol(opts => 
            opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果您的客户端是 C# 客户端,则必须在构建连接时添加相同的配置:

    new HubConnectionBuilder()
        .WithUrl("/yourhub")
        .AddNewtonsoftJsonProtocol(opts => 
            opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto)
        .Build();
    
    Run Code Online (Sandbox Code Playgroud)

如果您的客户端不是 C# 客户端,我想您将必须自己管理反序列化。NewtonSoft.Json只需$type向生成的 JSON 添加一个属性,其中包含完全限定的类型名称(例如:),Your.Namespace.ClassName以便您可以使用它来选择要反序列化的相应类型。

来源:MSDN