gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:34:40 25 4
gpt4 key购买 nike

通过 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);

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

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

我是否必须编写自己的 serialzier?它如何用于 dotnet 核心中的 SignalR?

最佳答案

我知道这是一个老问题,但这里有一个不需要编写您自己的 CustomConverter 而是依赖于 NewtonSoft 解决方案的其他解决方案:

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

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

    services.AddSignalR()
    .AddNewtonsoftJsonProtocol(opts =>
    opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto);
  3. 如果你的客户端是C#客户端,你必须在建立连接时添加相同的配置:

    new HubConnectionBuilder()
    .WithUrl("/yourhub")
    .AddNewtonsoftJsonProtocol(opts =>
    opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto)
    .Build();

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

来源:MSDN

关于c# - 通过 SignalR 发送不同对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60151229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com