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 中如何工作?
我知道这是一个老问题,但这是另一个解决方案,不需要您自己编写CustomConverter并依赖于该NewtonSoft解决方案:
首先你需要安装这个包: Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson
在服务器端,您需要在类中添加以下调用Startup.cs:
services.AddSignalR()
.AddNewtonsoftJsonProtocol(opts =>
opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto);
Run Code Online (Sandbox Code Playgroud)
如果您的客户端是 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
| 归档时间: |
|
| 查看次数: |
3383 次 |
| 最近记录: |