通过 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
解决方案的其他解决方案:
首先你需要安装这个包:
Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson
在服务器端,您需要在
Startup.cs
类中添加以下调用:services.AddSignalR() .AddNewtonsoftJsonProtocol(opts => opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto);
如果你的客户端是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/